/**
  * Verifica que el origen de datos esté totalmente configurado
  * 1) Que no tenga ningún campo sin significado
  * 2) Que tenga un campo con significado "calculo"
  */
 public function estaConfigurado(OrigenDatos $origen)
 {
     $tiene_campo_calculo = false;
     $tiene_descripcion = false;
     $tiene_pk = false;
     $tiene_null = false;
     $campos = $origen->getCampos();
     foreach ($campos as $campo) {
         $sig = $campo->getSignificado();
         if ($sig != null) {
             $significado = $sig->getCodigo();
             if ($origen->getEsCatalogo()) {
                 if ($significado == 'pk') {
                     $tiene_pk = true;
                 } elseif ($significado == 'descripcion') {
                     $tiene_descripcion = true;
                 }
             } else {
                 if ($significado == 'calculo') {
                     $tiene_campo_calculo = true;
                 }
             }
         } else {
             $tiene_null = true;
         }
     }
     if ($origen->getEsCatalogo()) {
         if (!$tiene_pk or $tiene_null or !$tiene_descripcion) {
             return false;
         } else {
             return true;
         }
     } elseif ($origen->getAreaCosteo() != '') {
         if ($tiene_null) {
             return false;
         } else {
             return true;
         }
     } else {
         if (!$tiene_campo_calculo or $tiene_null) {
             return false;
         } else {
             return true;
         }
     }
 }
 /**
  * {@inheritDoc}
  */
 public function getEsCatalogo()
 {
     $this->__initializer__ && $this->__initializer__->__invoke($this, 'getEsCatalogo', array());
     return parent::getEsCatalogo();
 }
Exemplo n.º 3
0
 /**
  * @Route("/origen_dato/{id}/leer", name="origen_dato_leer", options={"expose"=true})
  */
 public function leerOrigenAction(OrigenDatos $origenDato)
 {
     $resultado = array('estado' => 'ok', 'mensaje' => '', 'tipo_origen' => '', 'es_catalogo' => '', 'nombre_campos' => array(), 'datos' => array());
     $recargar = $this->getRequest()->get('recargar') == 'false' ? false : true;
     $em = $this->getDoctrine()->getManager();
     $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 dic\n                    FROM IndicadoresBundle:Diccionario dic\n                    ORDER BY dic.descripcion";
     $resultado['diccionarios'] = $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 (count($campos_existentes) == 0 or $recargar == true) {
         if ($origenDato->getSentenciaSql() != '') {
             $resultado['tipo_origen'] = 'sql';
             $sentenciaSQL = $origenDato->getSentenciaSql();
             $conexiones = $origenDato->getConexiones();
             if ($conexiones[0] == null) {
                 $resultado['mensaje'] = $this->get('translator')->trans('sentencia_error') . ': ' . $this->get('translator')->trans('_no_conexion_configurada_');
                 $resultado['estado'] = 'error';
             } else {
                 $conn = $this->getConexionGenerica('consulta_sql', $conexiones[0]);
                 try {
                     if ($this->driver == 'pdo_dblib') {
                         $sentenciaSQL = str_ireplace('SELECT', 'SELECT TOP 20 ', $sentenciaSQL);
                         $query = mssql_query($sentenciaSQL, $conn);
                         if (mssql_num_rows($query) > 0) {
                             while ($row = mssql_fetch_assoc($query)) {
                                 $resultado['datos'][] = $row;
                             }
                             $resultado['nombre_campos'] = array_keys($resultado['datos'][0]);
                         }
                     } else {
                         $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');
                 } catch (\PDOException $e) {
                     $resultado['mensaje'] = $this->get('translator')->trans('sentencia_error') . ' 1: ' . $e->getMessage();
                 } catch (DBAL\DBALException $e) {
                     $resultado['mensaje'] = $this->get('translator')->trans('sentencia_error') . ' 2: ' . $e->getMessage();
                 } catch (\Exception $e) {
                     $resultado['mensaje'] = $this->get('translator')->trans('sentencia_error') . ' 3: ' . $e->getMessage();
                 }
             }
         } else {
             $resultado['tipo_origen'] = 'archivo';
             $reader = new Excel();
             try {
                 $reader->loadFile($origenDato->getAbsolutePath());
                 $datos = $reader->getSheet()->toArray($nullValue = null, $calculateFormulas = true, $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['estado'] = 'error';
                 $resultado['mensaje'] = $e->getMessage();
             }
         }
         // Guardar los campos
         if ($resultado['estado'] == 'ok') {
             $nombres_id = array();
             $campo = array();
             //Por defecto poner tipo entero
             $tipoCampo = $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($tipoCampo);
                     $em->persist($campo[$k]);
                     $nombres_id[$campo[$k]->getId()] = $nombre_campo;
                 } else {
                     $nombres_id[$campos[$nombre_campo]['id']] = $nombre_campo;
                 }
             }
             //Borrar algún campo que ya no se use
             foreach ($campos_existentes as $campo) {
                 if (!in_array($campo->getNombre(), $nombres_id)) {
                     $em->remove($campo);
                 }
             }
             try {
                 $em->flush();
             } catch (\Exception $e) {
                 $resultado = array('estado' => 'error', 'mensaje' => '<div class="alert alert-danger"> ' . $this->get('translator')->trans('camio_no_realizado') . '</div>');
             }
             $resultado['nombre_campos'] = $nombres_id;
         }
         $campos_existentes = $em->getRepository('IndicadoresBundle:Campo')->findBy(array('origenDato' => $origenDato));
     } else {
         foreach ($campos_existentes as $campo) {
             $nombre_campos[$campo->getId()] = $campo->getNombre();
         }
         $resultado['nombre_campos'] = $nombre_campos;
     }
     $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()]['diccionario'] = $campo->getDiccionario() ? $campo->getDiccionario()->getId() : 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[$util->slug($k)] .= trim(mb_check_encoding($v, 'UTF-8') ? $v : utf8_encode($v)) . ', ';
         }
     }
     $resultado['datos'] = $aux;
     return new Response(json_encode($resultado));
 }