コード例 #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();
 }
コード例 #2
0
 public function enviarDatos($idOrigen, $datos, $campos_sig, $ultima_lectura, $nombre_conexion)
 {
     //Esta cola la utilizaré solo para leer todos los datos y luego mandar uno por uno
     // a otra cola que se encarará de guardarlo en la base de datos
     // luego se puede probar a mandar por grupos
     $datos_a_enviar = array();
     $util = new \MINSAL\IndicadoresBundle\Util\Util();
     $i = 0;
     $ii = 0;
     if ($datos) {
         foreach ($datos as $fila) {
             $nueva_fila = array();
             foreach ($fila as $k => $v) {
                 // Quitar caracteres no permitidos que podrian existir en el nombre de campo (tildes, eñes, etc)
                 //Verificar si ya está en UTF-8, si no, codificarlo
                 $nueva_fila[$campos_sig[$util->slug($k)]] = trim(mb_check_encoding($v, 'UTF-8') ? $v : utf8_encode($v));
             }
             //Agregar el nombre de la conexión como campo
             $nueva_fila['origen_dato'] = $nombre_conexion;
             $datos_a_enviar[] = $nueva_fila;
             //Enviaré en grupos de 200
             if ($i == 200) {
                 $msg_guardar = array('id_origen_dato' => $idOrigen, 'method' => 'PUT', 'datos' => $datos_a_enviar, 'ultima_lectura' => $ultima_lectura, 'num_msj' => $ii++);
                 $this->container->get('old_sound_rabbit_mq.guardar_registro_producer')->publish(serialize($msg_guardar));
                 unset($datos_a_enviar);
                 $datos_a_enviar = array();
                 $i = 0;
             }
             $i++;
         }
     }
     //Verificar si quedaron pendientes de enviar
     if (count($datos_a_enviar) > 0) {
         $msg_guardar = array('id_origen_dato' => $idOrigen, 'method' => 'PUT', 'datos' => $datos_a_enviar, 'ultima_lectura' => $ultima_lectura, 'num_msj' => $ii++);
         $this->container->get('old_sound_rabbit_mq.guardar_registro_producer')->publish(serialize($msg_guardar));
     }
 }
コード例 #3
0
ファイル: Conexion.php プロジェクト: SM2015/Etab-hibrido
 /**
  * Get clave
  *
  * @return string
  */
 public function getClave()
 {
     $Util = new \MINSAL\IndicadoresBundle\Util\Util();
     return $Util->desencriptar_clave($this->clave);
 }
コード例 #4
0
 public function setNombreCatalogo($origenDato)
 {
     if ($origenDato->getEsCatalogo()) {
         // replace all non letters or digits by -
         $util = new \MINSAL\IndicadoresBundle\Util\Util();
         $origenDato->setNombreCatalogo('ctl_' . $util->slug($origenDato->getNombre()));
     }
 }
コード例 #5
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();
     }
 }
コード例 #6
0
 /**
  * @Route("/configurar/campo", name="configurar_campo", options={"expose"=true})
  */
 public function configurarCampoAction()
 {
     $resultado = array('estado' => 'success', 'mensaje' => '');
     $em = $this->getDoctrine()->getManager();
     $req = $this->getRequest();
     list($tipo_cambio, $id) = explode('__', $req->get('control'));
     $valor = $req->get('valor');
     $campo = $em->find("IndicadoresBundle:Campo", $id);
     $valido = true;
     if ($tipo_cambio == 'tipo_campo') {
         $tipo_campo = $em->find("IndicadoresBundle:TipoCampo", $valor);
         if (strlen($req->get('datos_prueba'))) {
             $datos_prueba = explode(', ', $req->get('datos_prueba'));
             $util = new \MINSAL\IndicadoresBundle\Util\Util();
             foreach ($datos_prueba as $dato) {
                 $valido = $util->validar($dato, $tipo_campo->getCodigo());
                 if (!$valido) {
                     break;
                 }
             }
         }
         $mensaje = $campo->getNombre() . ': ' . $this->get('translator')->trans('tipo_campo_cambiado_a') . ' ' . $tipo_campo->getDescripcion();
         $campo->setTipoCampo($tipo_campo);
     } elseif ($tipo_cambio == 'significado_variable') {
         $significado_variable = $em->find("IndicadoresBundle:SignificadoCampo", $valor);
         $mensaje = $campo->getNombre() . ': ' . $this->get('translator')->trans('significado_campo_cambiado_a') . ' ' . $significado_variable->getDescripcion();
         $campo->setSignificado($significado_variable);
     } else {
         $diccionario = $em->find("IndicadoresBundle:Diccionario", $valor);
         $mensaje = $campo->getNombre() . ': ' . $this->get('translator')->trans('_diccionario_aplicado_') . ' ' . $diccionario->getDescripcion();
         $campo->setDiccionario($diccionario);
     }
     if ($valido) {
         $resultado['mensaje'] = $mensaje;
     } else {
         $resultado = array('estado' => 'error', 'mensaje' => $this->get('translator')->trans('_tipo_no_corresponde_con_datos_'));
     }
     try {
         $em->flush();
     } catch (\Exception $e) {
         $resultado = array('estado' => 'error', 'mensaje' => $this->get('translator')->trans('camio_no_realizado'));
     }
     return new Response(json_encode($resultado));
 }
コード例 #7
0
 /** Toma el ID de un indicador para crear Schema de Mondrian y lo agrega las fuentes de datos de Pentaho.
  * @Route("/indicador/{id}/mondrian", name="indicador_mondrian", options={"expose"=true})
  */
 public function indicadorMondrian()
 {
     $em = $this->getDoctrine()->getManager();
     $req = $this->getRequest();
     $util = new \MINSAL\IndicadoresBundle\Util\Util();
     $indicador = $em->find('IndicadoresBundle:FichaTecnica', $req->get('id'));
     $campos = str_replace("'", '', $indicador->getCamposIndicador());
     $dims = '';
     $cubo = false;
     foreach (explode(",", $campos) as $cosa) {
         if (strstr($cosa, 'id_')) {
             $sig = $em->getRepository('IndicadoresBundle:SignificadoCampo')->findOneBy(array('codigo' => trim($cosa)));
             $catalogo = $sig->getCatalogo();
             if ($catalogo != '') {
                 $dims = $dims . "\n<DimensionUsage source='" . ucfirst(substr(trim($cosa), 3)) . "' name='" . ucfirst(substr(trim($cosa), 3)) . "' visible='true' " . "foreignKey='" . trim($cosa) . "' highCardinality='false'/>";
                 $cubo = true;
             }
         }
     }
     if ($cubo) {
         $schemaFile = $this->container->getParameter('carpeta_siig_mondrian') . '/indicador' . $req->get('id') . '.mondrian.xml';
         $fh = fopen($this->container->getParameter('carpeta_siig_mondrian') . '/cubo_base.txt', 'r');
         $base_cubo = fread($fh, filesize($this->container->getParameter('carpeta_siig_mondrian') . '/cubo_base.txt'));
         fclose($fh);
         $formula = str_replace(' ', '', $indicador->getFormula());
         preg_match_all('/\\{([\\w]+)\\}/', $formula, $vars_formula);
         $formula = strtolower($formula);
         $formula = str_replace('{', '[Measures].[', $formula);
         $formula = str_replace('}', ']', $formula);
         $datos = "\n<Cube name='" . $indicador->getNombre() . "' visible='true' cache='true' enabled='true'>" . "\n<Table name='tmp_ind_" . $util->slug($indicador->getNombre()) . "' schema='public'></Table>" . $dims;
         foreach ($vars_formula[1] as $myvar) {
             $datos = $datos . "\n<Measure name='" . strtolower($myvar) . "' column='" . strtolower($myvar) . "' formatString='#' aggregator='sum'></Measure>";
         }
         $datos = $datos . "\n <CalculatedMember name='Valor (" . $indicador->getUnidadMedida() . ")'" . " formula='" . $formula . "' dimension='Measures' visible='true'></CalculatedMember>\n</Cube>\n</Schema>";
         $fh = fopen($schemaFile, 'w');
         fwrite($fh, $this->formatXML("\n<Schema name='Indicador " . $req->get('id') . "'>\n " . $base_cubo . $datos));
         fclose($fh);
         $pentahoResource = $this->container->getParameter('carpeta_siig_mondrian') . $this->container->getParameter('listado_metadata');
         $xml = simplexml_load_file($pentahoResource);
         $node = $xml->xpath('//Catalogs');
         $catalog = $node[0]->addChild('Catalog');
         $catalog->addAttribute('name', 'Indicador ' . $req->get('id'));
         $catalog->addChild('DataSourceInfo', 'Provider=mondrian;DataSource=' . $this->container->getParameter('conexion_bd_pentaho'));
         $catalog->addChild('Definition', $schemaFile);
         $fh = fopen($pentahoResource, 'w');
         fwrite($fh, $this->formatXML($xml->asXML()));
         fclose($fh);
     }
     $em->flush();
     return new Response($cubo ? 'Se creo nuevo esquema' : 'No es posible crear cubo');
 }
コード例 #8
0
 public function calcularIndicador(FichaTecnica $fichaTecnica, $dimension, $filtro_registros = null, $ver_sql = false)
 {
     $util = new \MINSAL\IndicadoresBundle\Util\Util();
     $acumulado = $fichaTecnica->getEsAcumulado();
     $formula = str_replace(' ', '', strtolower($fichaTecnica->getFormula()));
     //Recuperar las variables
     $variables = array();
     preg_match_all('/\\{[a-z0-9\\_]{1,}\\}/', strtolower($formula), $variables, PREG_SET_ORDER);
     $denominador = explode('/', $fichaTecnica->getFormula());
     $evitar_div_0 = '';
     $variables_d = array();
     if (count($denominador) > 1) {
         preg_match('/\\{.{1,}\\}/', $denominador[1], $variables_d);
         if (count($variables_d) > 0) {
             $var_d = strtolower(str_replace(array('{', '}'), array('(', ')'), array_shift($variables_d)));
         }
         $evitar_div_0 = 'AND ' . $var_d . ' > 0';
     }
     // Formar la cadena con las variables para ponerlas en la consulta
     $variables_query = '';
     foreach ($variables as $var) {
         $oper_ = explode($var[0], $formula);
         $tieneOperadores = preg_match('/([A-Za-z]+)\\($/', $oper_[0], $coincidencias, PREG_OFFSET_CAPTURE);
         $oper = $tieneOperadores ? $coincidencias[1][0] : 'SUM';
         $v = str_replace(array('{', '}'), array('', ''), $var[0]);
         $formula = str_replace($var[0], ($oper == 'SUM' ? $oper : '') . str_replace(array('{', '}'), array('(', ')'), $var[0]), $formula);
         $variables_query .= " {$oper}({$v}) as {$v}, ";
     }
     $variables_query = trim($variables_query, ', ');
     $nombre_indicador = $util->slug($fichaTecnica->getNombre());
     $tabla_indicador = 'tmp_ind_' . $nombre_indicador;
     //Verificar si es un catálogo
     $rel_catalogo = '';
     $otros_campos = '';
     $grupo_extra = '';
     $significado = $this->getEntityManager()->getRepository('IndicadoresBundle:SignificadoCampo')->findOneBy(array('codigo' => $dimension));
     $catalogo = $significado->getCatalogo();
     if ($catalogo != '') {
         $rel_catalogo = " INNER JOIN  {$catalogo}  B ON (A.{$dimension}::text = B.id::text) ";
         $dimension = 'B.descripcion';
         $otros_campos = ' B.id AS id_category, ';
         $grupo_extra = ', B.id ';
     }
     $filtros = '';
     if ($filtro_registros != null) {
         foreach ($filtro_registros as $campo => $valor) {
             //Si el filtro es un catálogo, buscar su id correspondiente
             $significado = $this->getEntityManager()->getRepository('IndicadoresBundle:SignificadoCampo')->findOneBy(array('codigo' => $campo));
             $catalogo = $significado->getCatalogo();
             $sql_ctl = '';
             if ($catalogo != '') {
                 $sql_ctl = "SELECT id FROM {$catalogo} WHERE descripcion ='{$valor}'";
                 $reg = $this->getEntityManager()->getConnection()->executeQuery($sql_ctl)->fetch();
                 $valor = $reg['id'];
             }
             $filtros .= " AND A." . $campo . " = '{$valor}' ";
         }
     }
     if ($acumulado) {
         $em = $this->getEntityManager();
         $var_n = array_pop(str_replace(array('{', '}'), array('', ''), $variables[0]));
         $var_d = array_pop(str_replace(array('{', '}'), array('', ''), $variables[1]));
         $filtros_ = str_replace('A.', 'AA.', $filtros_);
         //leer la primera fila para determinar el tipo de dato de la dimensión actual
         $sql2 = "SELECT {$dimension} FROM {$tabla_indicador} LIMIT 1";
         $operador = is_numeric(array_pop($em->getConnection()->executeQuery($sql2)->fetch())) ? '<=' : '=';
         $formula = str_replace(array('SUM(' . $var_n . ')', 'SUM(' . $var_d . ')'), array("(SELECT SUM(AA.{$var_n}) FROM {$tabla_indicador} AA WHERE AA.{$dimension} {$operador} A.{$dimension} {$filtros_})", "(SELECT SUM(DISTINCT AA.{$var_d}) FROM {$tabla_indicador} AA WHERE AA.{$dimension} {$operador} A.{$dimension} {$filtros_})"), $formula);
         $variables_query = str_replace(array('SUM(' . $var_n . ')', 'SUM(' . $var_d . ')'), array("(SELECT SUM(AA.{$var_n}) FROM {$tabla_indicador} AA WHERE AA.{$dimension} {$operador} A.{$dimension} {$filtros_})", "(SELECT SUM(DISTINCT AA.{$var_d}) FROM {$tabla_indicador} AA WHERE AA.{$dimension} {$operador} A.{$dimension} {$filtros_})"), $variables_query);
     }
     $sql = "SELECT {$dimension} AS category, {$otros_campos} {$variables_query}, round(({$formula})::numeric,2) AS measure\n            FROM {$tabla_indicador} A" . $rel_catalogo;
     $sql .= ' WHERE 1=1 ' . $evitar_div_0 . ' ' . $filtros;
     $sql .= "\n            GROUP BY {$dimension} {$grupo_extra}";
     $sql .= $acumulado ? '' : "HAVING (({$formula})::numeric) > 0";
     $sql .= "ORDER BY {$dimension}";
     try {
         if ($ver_sql == true) {
             return $sql;
         } else {
             return $this->getEntityManager()->getConnection()->executeQuery($sql)->fetchAll();
         }
     } catch (\PDOException $e) {
         return $e->getMessage();
     } catch (\Doctrine\DBAL\DBALException $e) {
         return $e->getMessage();
     }
 }
コード例 #9
0
 /**
  * @Route("/{id}/leer", name="origen_dato_leer", options={"expose"=true})
  */
 public function leerOrigenAction($id)
 {
     $resultado = array('estado' => 'error', 'mensaje' => '', 'tipos_datos' => array(), 'tipo_origen' => '', 'es_catalogo' => '', 'significados' => array(), 'nombre_campos' => array(), 'datos' => array());
     $em = $this->getDoctrine()->getEntityManager();
     $origenDato = $em->find("IndicadoresBundle:OrigenDatos", $id);
     $resultado['es_catalogo'] = $origenDato->getEsCatalogo() ? true : false;
     $sql = "SELECT tp \n                    FROM IndicadoresBundle:TipoCampo tp \n                    ORDER BY tp.descripcion";
     $resultado['tipos_datos'] = $em->createQuery($sql)->getArrayResult();
     $sql = "SELECT sv \n                    FROM IndicadoresBundle:SignificadoCampo sv                      \n                    WHERE sv.usoEnCatalogo = :uso_en_catalogo \n                    ORDER BY sv.descripcion";
     $resultado['significados'] = $em->createQuery($sql)->setParameter('uso_en_catalogo', $resultado['es_catalogo'] ? 'true' : 'false')->getArrayResult();
     //recuperar los campos ya existentes en el origen de datos
     $campos_existentes = $em->getRepository('IndicadoresBundle:Campo')->findBy(array('origenDato' => $origenDato));
     $campos = array();
     foreach ($campos_existentes as $campo) {
         $campos[$campo->getNombre()]['id'] = $campo->getId();
     }
     $resultado['campos'] = $campos;
     if ($origenDato->getSentenciaSql() != '') {
         $resultado['tipo_origen'] = 'sql';
         $sentenciaSQL = $origenDato->getSentenciaSql();
         $idConexion = $origenDato->getConexion()->getId();
         $conn = $this->getConexionGenerica('consulta_sql', $idConexion);
         try {
             $query = $conn->query($sentenciaSQL . ' LIMIT 20');
             if ($query->rowCount() > 0) {
                 $resultado['datos'] = $query->fetchAll();
                 $resultado['nombre_campos'] = array_keys($resultado['datos'][0]);
             }
             $resultado['estado'] = 'ok';
             $resultado['mensaje'] = '<span style="color: green">' . $this->get('translator')->trans('sentencia_success') . '</span>';
         } catch (\PDOException $e) {
             $resultado['mensaje'] = '<span style="color: red">' . $this->get('translator')->trans('sentencia_error') . ': ' . $e->getMessage() . '</span>';
         } catch (DBAL\DBALException $e) {
             $resultado['mensaje'] = '<span style="color: red">' . $this->get('translator')->trans('sentencia_error') . ': ' . $e->getMessage() . '</span>';
         }
     } else {
         $resultado['tipo_origen'] = 'archivo';
         $reader = new Excel();
         try {
             $reader->loadFile($origenDato->getAbsolutePath());
             $datos = $reader->getSheet()->toArray($nullValue = null, $calculateFormulas = false, $formatData = false, $returnCellRef = false);
             $resultado['nombre_campos'] = array_values(array_shift($datos));
             // Buscar por columnas que tengan null en el título
             $primer_null = array_search(null, $resultado['nombre_campos']);
             if ($primer_null == false) {
                 foreach ($datos as $fila) {
                     $resultado['datos'][] = $fila;
                 }
             } else {
                 $resultado['nombre_campos'] = array_slice($resultado['nombre_campos'], 0, $primer_null, true);
                 foreach ($datos as $fila) {
                     $resultado['datos'][] = array_slice($fila, 0, $primer_null, true);
                 }
             }
             $resultado['estado'] = 'ok';
             // Poner el nombre de la columna como indice del arreglo
             $aux = array();
             foreach ($resultado['datos'] as $fila) {
                 $aux[] = array_combine($resultado['nombre_campos'], $fila);
             }
             $resultado['datos'] = $aux;
         } catch (\Exception $e) {
             $resultado['mensaje'] = '<span style="color: red">' . $e->getMessage() . '</span>';
         }
     }
     // Guardar los campos
     if ($resultado['estado'] == 'ok') {
         $nombres_id = array();
         $campo = array();
         //Por defecto poner tipo texto
         $tipo_campo = $em->getRepository("IndicadoresBundle:TipoCampo")->findOneByCodigo('integer');
         $util = new \MINSAL\IndicadoresBundle\Util\Util();
         foreach ($resultado['nombre_campos'] as $k => $nombre) {
             // si existe no guardarlo
             $nombre_campo = $util->slug($nombre);
             if (!array_key_exists($nombre_campo, $campos)) {
                 $campo[$k] = new Campo();
                 $campo[$k]->setNombre($nombre_campo);
                 $campo[$k]->setOrigenDato($origenDato);
                 $campo[$k]->setTipoCampo($tipo_campo);
                 $em->persist($campo[$k]);
                 $nombres_id[$campo[$k]->getId()] = $nombre_campo;
             } else {
                 $nombres_id[$campos[$nombre_campo]['id']] = $nombre_campo;
             }
         }
         try {
             $em->flush();
         } catch (\Exception $e) {
             $resultado = array('estado' => 'error', 'mensaje' => '<div class="alert alert-error"> ' . $this->get('translator')->trans('camio_no_realizado') . '</div>');
         }
         $resultado['nombre_campos'] = $nombres_id;
     }
     $campos_existentes = $em->getRepository('IndicadoresBundle:Campo')->findBy(array('origenDato' => $origenDato));
     $campos = array();
     foreach ($campos_existentes as $campo) {
         $campos[$campo->getNombre()]['id'] = $campo->getId();
         $campos[$campo->getNombre()]['significado'] = $campo->getSignificado() ? $campo->getSignificado()->getId() : null;
         $campos[$campo->getNombre()]['significado_codigo'] = $campo->getSignificado() ? $campo->getSignificado()->getCodigo() : null;
         $campos[$campo->getNombre()]['tipo'] = $campo->getTipoCampo() ? $campo->getTipoCampo()->getId() : null;
     }
     $resultado['campos'] = $campos;
     //Cambiar la estructura
     $aux = array();
     foreach ($resultado['nombre_campos'] as $n) {
         $aux[$n] = '';
     }
     foreach (array_slice($resultado['datos'], 0, 10) as $fila) {
         foreach ($fila as $k => $v) {
             $aux[$k] .= $v . ', ';
         }
     }
     $resultado['datos'] = $aux;
     return new Response(json_encode($resultado));
 }
コード例 #10
0
 public function preUpdate($Significado)
 {
     $util = new \MINSAL\IndicadoresBundle\Util\Util();
     $Significado->setCodigo($util->slug($Significado->getCodigo()));
 }