public function execute(AMQPMessage $msg)
 {
     $msg = unserialize($msg->body);
     $em = $this->container->get('doctrine.orm.entity_manager');
     $error = false;
     $idOrigen = $msg['id_origen_dato'];
     $origenDato = $em->find('IndicadoresBundle:OrigenDatos', $idOrigen);
     $nombre_conexion = null;
     $campos_sig = $msg['campos_significados'];
     $fecha = new \DateTime("now");
     $ahora = $fecha->format('Y-m-d H:i:s');
     //Leeré los datos en grupos de 10,000
     $tamanio = 10000;
     try {
         if ($origenDato->getSentenciaSql() != '') {
             // Recorrer cada conexión que tenga asociado el origen de datos
             foreach ($origenDato->getConexiones() as $cnx) {
                 $leidos = 10001;
                 $i = 0;
                 $nombre_conexion = $cnx->getNombreConexion();
                 if ($cnx->getIdMotor()->getCodigo() != 'pdo_dblib') {
                     $sql = $msg['sql'];
                     while ($leidos >= $tamanio) {
                         // Limita la actualizacion incremental
                         $where = '';
                         if (!empty($msg['limites']['valorSuperior']) || !empty($msg['limites']['valorInferior'])) {
                             $where = 'WHERE 1=1 ';
                             if (!empty($msg['limites']['valorSuperior'])) {
                                 $where .= ' AND ' . $msg['limites']['campoSuperior'] . '>' . $msg['limites']['valorSuperior'];
                             }
                             if (!empty($msg['limites']['valorInferior'])) {
                                 $where .= ' OR (' . $msg['limites']['campoSuperior'] . '=' . $msg['limites']['valorSuperior'] . ' AND ' . $msg['limites']['campoInferior'] . '>' . $msg['limites']['valorInferior'] . ')';
                             }
                         }
                         $sql_aux = 'SELECT * FROM (' . $sql . ') AS sqlOriginal ' . $where . ' LIMIT ' . $tamanio . ' OFFSET ' . $i * $tamanio;
                         $datos = $em->getRepository('IndicadoresBundle:OrigenDatos')->getDatos($sql_aux, $cnx);
                         $this->enviarDatos($idOrigen, $datos, $campos_sig, $ahora, $nombre_conexion, $msg);
                         $leidos = count($datos);
                         $i++;
                     }
                 } else {
                     $datos = $em->getRepository('IndicadoresBundle:OrigenDatos')->getDatos($msg['sql'], $cnx);
                     $this->enviarDatos($idOrigen, $datos, $campos_sig, $ahora, $nombre_conexion, $msg);
                 }
             }
         } else {
             $datos = $em->getRepository('IndicadoresBundle:OrigenDatos')->getDatos(null, null, $origenDato->getAbsolutePath());
             $this->enviarDatos($idOrigen, $datos, $campos_sig, $ahora, $nombre_conexion, $msg);
         }
     } catch (\Exception $exc) {
         $error = true;
         $origenDatos = $em->find('IndicadoresBundle:OrigenDatos', $msg['id_origen_dato']);
         // Crear el registro para el reporte de actualizacion
         $reporteActualizacion = new ReporteActualizacion();
         $reporteActualizacion->setOrigenDatos($origenDatos);
         $reporteActualizacion->setEstatusAct($em->find('IndicadoresBundle:EstatusActualizacion', 2));
         $reporteActualizacion->setFecha(new \DateTime('now'));
         $reporteActualizacion->setReporte($exc->getMessage());
         $em->persist($reporteActualizacion);
         $em->flush();
     }
     if (!$error) {
         //Después de enviados todos los registros para guardar, mandar mensaje para borrar los antiguos
         $msg_guardar = array('id_origen_dato' => $idOrigen, 'method' => 'DELETE', 'ultima_lectura' => $ahora, 'es_incremental' => $msg['es_incremental']);
         $this->container->get('old_sound_rabbit_mq.guardar_registro_producer')->publish(serialize($msg_guardar));
     }
     return true;
 }
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $em = $this->getContainer()->get('doctrine')->getManager();
     $ahora = new \DateTime("now");
     //Recuperar todos los origenes de datos
     $origenesDatos = $em->getRepository('IndicadoresBundle:OrigenDatos')->findAll();
     foreach ($origenesDatos as $origenDato) {
         $ultima_lectura = $em->getRepository('IndicadoresBundle:ReporteActualizacion')->getUltimaActualizacion($origenDato->getId());
         if ($ultima_lectura == null) {
             $dif = 1;
         } else {
             // Agregar a la ultima lectura la ventana de actualizacion
             if ($origenDato->getVentana()) {
                 $days = $origenDato->getVentana() == 1 ? 'day' : 'days';
                 $ultima_lectura->add(date_interval_create_from_date_string($origenDato->getVentana() . ' ' . $days));
             }
             if ($origenDato->getPeriodicidad() != null) {
                 $periocidad = $origenDato->getPeriodicidad()->getCodigo();
             } else {
                 $periocidad = 'd';
             }
             $intervalo = $ahora->diff($ultima_lectura);
             $dif_dias = $intervalo->format('%a');
             if ($periocidad == 'd') {
                 //Diario?
                 $dif = $dif_dias;
             } elseif ($periocidad == 'sm') {
                 //semanal?
                 $dif = $dif_dias / 7;
             } elseif ($periocidad == 'q') {
                 $dif = $dif_dias / 15;
             } elseif ($periocidad == 'm') {
                 $dif = $dif_dias / 30;
             } elseif ($periocidad == 'b') {
                 $dif = $dif_dias / 30 * 2;
             } elseif ($periocidad == 't') {
                 $dif = $dif_dias / 30 * 3;
             } elseif ($periocidad == 'c') {
                 $dif = $dif_dias / 30 * 4;
             } elseif ($periocidad == 's') {
                 $dif = $dif_dias / 30 * 6;
             } elseif ($periocidad == 'a') {
                 $dif = $dif_dias / 365;
             } else {
                 $dif = 1;
             }
             // No tiene periocidad, cargarlo
         }
         if ($dif >= 1) {
             // Recuperar el nombre y significado de los campos del origen de datos
             $campos_sig = array();
             $campos = $origenDato->getCampos();
             foreach ($campos as $campo) {
                 $campos_sig[$campo->getNombre()] = $campo->getSignificado()->getCodigo();
             }
             $campos = null;
             $limites = null;
             if ($origenDato->getActualizacionIncremental()) {
                 $limites = null;
                 // Obtener todos los campos del origen de datos
                 // es necesario para la carga incremental
                 $objsCampos = $origenDato->getCampos();
                 $ordenTiempo = $this->getContainer()->getParameter('tiempo');
                 $campos = array();
                 foreach ($objsCampos as $campo) {
                     $campos[$campo->getSignificado()->getCodigo()] = $campo->getNombre();
                 }
                 $maxCampoSuperior = '';
                 $maxCampoInferior = '';
                 $sqlCampoSuperior = '';
                 $sqlCampoInferior = '';
                 foreach ($ordenTiempo as $tiempo) {
                     if (empty($maxCampoSuperior)) {
                         if (array_key_exists($tiempo, $campos)) {
                             $maxCampoSuperior = $tiempo;
                             $sqlCampoSuperior = $campos[$tiempo];
                         }
                     }
                     if (array_key_exists($tiempo, $campos)) {
                         $maxCampoInferior = $tiempo;
                         $sqlCampoInferior = $campos[$tiempo];
                     }
                 }
                 $sql = 'SELECT
                             MAX(CAST (datos->\'' . $maxCampoSuperior . '\' AS INTEGER)) AS val_superior,
                             MAX(CAST (datos->\'' . $maxCampoInferior . '\' AS INTEGER)) AS val_inferior
                         FROM fila_origen_dato WHERE id_origen_dato = ' . $origenDato->getId();
                 $result = $em->getConnection()->executeQuery($sql)->fetchAll();
                 if (!empty($result)) {
                     $maxValorSuperior = $result[0]['val_superior'];
                     $maxValorInferior = $result[0]['val_inferior'];
                     // Si el mes superior es 12 entonces tomamos datos del siguiente año
                     if ($maxCampoSuperior == 'anio' && $maxCampoInferior == 'id_mes' && $maxValorInferior == 12) {
                         $maxValorInferior = 0;
                     }
                     if ($maxCampoSuperior == $maxCampoInferior) {
                         $maxCampoInferior = null;
                         $maxValorInferior = null;
                     }
                     $limites = array('campoSuperior' => $sqlCampoSuperior, 'valorSuperior' => $maxValorSuperior, 'campoInferior' => $sqlCampoInferior, 'valorInferior' => $maxValorInferior);
                 }
             }
             $msg = array('id_origen_dato' => $origenDato->getId(), 'sql' => $origenDato->getSentenciaSql(), 'es_incremental' => $origenDato->getActualizacionIncremental(), 'campos_significados' => $campos_sig, 'limites' => $limites);
             $carga_directa = $origenDato->getEsCatalogo();
             // No mandar a la cola de carga los que son catálogos, Se cargarán directamente
             if ($carga_directa) {
                 $respuesta = $em->getRepository('IndicadoresBundle:OrigenDatos')->cargarCatalogo($origenDato);
                 $reporteActualizacion = new ReporteActualizacion();
                 $reporteActualizacion->setOrigenDatos($origenDato);
                 $reporteActualizacion->setFecha(new \DateTime('now'));
                 if ($respuesta !== true) {
                     // Crear el registro para el reporte de actualizacion
                     $reporteActualizacion->setEstatusAct($em->find('IndicadoresBundle:EstatusActualizacion', 2));
                     $reporteActualizacion->setReporte($respuesta);
                 } else {
                     // Crear el registro para el reporte de actualizacion
                     $reporteActualizacion->setEstatusAct($em->find('IndicadoresBundle:EstatusActualizacion', 1));
                     $reporteActualizacion->setReporte('Actualizacion correcta');
                 }
                 $em->persist($reporteActualizacion);
                 $em->flush();
             } else {
                 $this->getContainer()->get('old_sound_rabbit_mq.cargar_origen_datos_producer')->publish(serialize($msg));
             }
         }
     }
     $em->flush();
 }
 public function execute(AMQPMessage $mensaje)
 {
     $msg = unserialize($mensaje->body);
     // Si se retorna falso se enviará un mensaje que le indicará al producer que no se pudo procesar
     // correctamente el mensaje y será enviado nuevamente
     if ($msg['method'] == 'PUT') {
         $fila1 = $msg['datos'][0];
         $llaves_aux1 = '';
         foreach ($fila1 as $k => $campo) {
             $llaves_aux1 .= "'{$k}', ";
         }
         $llaves_aux1 = trim($llaves_aux1, ', ');
         // Verificar si existe la tabla fila_origen_dato_aux, sino existe crearla
         try {
             $this->em->getConnection()->exec("SELECT 1 FROM fila_origen_dato_aux LIMIT 1");
         } catch (\Exception $exc) {
             $this->em->getConnection()->exec("SELECT id_origen_dato, datos, ultima_lectura INTO fila_origen_dato_aux FROM fila_origen_dato LIMIT 0");
         }
         try {
             $sql = "INSERT INTO fila_origen_dato_aux(id_origen_dato, datos, ultima_lectura)\n                        VALUES ";
             $i = 0;
             foreach ($msg['datos'] as $fila) {
                 $llaves_aux2 = '';
                 foreach ($fila as $k => $campo) {
                     $llaves_aux2 .= ":{$k}" . "_{$i}, ";
                 }
                 $llaves_aux2 = trim($llaves_aux2, ', ');
                 $sql .= "(:id_origen_dato, hstore(ARRAY[{$llaves_aux1}], ARRAY[{$llaves_aux2}]), :ultima_lectura), ";
                 $i++;
             }
             $sql = trim($sql, ', ');
             $sth = $this->em->getConnection()->prepare($sql);
             $sth->bindParam(':id_origen_dato', $msg['id_origen_dato']);
             $sth->bindParam(':ultima_lectura', $msg['ultima_lectura']);
             $this->em->getConnection()->beginTransaction();
             $i = 0;
             foreach ($msg['datos'] as $fila) {
                 foreach ($fila as $k => $value) {
                     $llave = ':' . $k . '_' . $i;
                     $sth->bindValue("{$llave}", trim($value));
                 }
                 $i++;
             }
             $result = $sth->execute();
             if (!$result) {
                 return false;
             }
             $this->em->getConnection()->commit();
         } catch (\Exception $exc) {
             $origenDatos = $this->em->find('IndicadoresBundle:OrigenDatos', $msg['id_origen_dato']);
             // Crear el registro para el reporte de actualizacion
             $reporteActualizacion = new ReporteActualizacion();
             $reporteActualizacion->setOrigenDatos($origenDatos);
             $reporteActualizacion->setEstatusAct($this->em->find('IndicadoresBundle:EstatusActualizacion', 2));
             $reporteActualizacion->setFecha(new \DateTime('now'));
             $reporteActualizacion->setReporte($exc->getMessage());
             $this->em->persist($reporteActualizacion);
             $this->em->flush();
             return false;
         }
         return true;
     } elseif ($msg['method'] == 'DELETE') {
         try {
             $this->em->getConnection()->beginTransaction();
             //Borrar los datos existentes por el momento así será pero debería haber una forma de ir a traer solo los nuevos
             $sql = '';
             if ($msg['es_incremental'] == true) {
                 $sql = "INSERT INTO fila_origen_dato SELECT * FROM fila_origen_dato_aux WHERE id_origen_dato='{$msg['id_origen_dato']}';\n                        DELETE FROM fila_origen_dato_aux WHERE id_origen_dato='{$msg['id_origen_dato']}' ;\n                        ";
             } else {
                 $sql = "DELETE FROM fila_origen_dato WHERE id_origen_dato='{$msg['id_origen_dato']}'  ;\n                        INSERT INTO fila_origen_dato SELECT * FROM fila_origen_dato_aux WHERE id_origen_dato='{$msg['id_origen_dato']}';\n                        DELETE FROM fila_origen_dato_aux WHERE id_origen_dato='{$msg['id_origen_dato']}' ;\n                        ";
             }
             $this->em->getConnection()->exec($sql);
             $this->em->getConnection()->commit();
             $origenDatos = $this->em->find('IndicadoresBundle:OrigenDatos', $msg['id_origen_dato']);
             // Crear el registro para el reporte de actualizacion
             $reporteActualizacion = new ReporteActualizacion();
             $reporteActualizacion->setOrigenDatos($origenDatos);
             $reporteActualizacion->setEstatusAct($this->em->find('IndicadoresBundle:EstatusActualizacion', 1));
             $reporteActualizacion->setFecha(new \DateTime('now'));
             $reporteActualizacion->setReporte('Actualizacion correcta');
             $this->em->persist($reporteActualizacion);
             $this->em->flush();
             //Recalcular la tabla del indicador
             //Recuperar las variables en las que está presente el origen de datos
             $origenDatos = $this->em->find('IndicadoresBundle:OrigenDatos', $msg['id_origen_dato']);
             foreach ($origenDatos->getVariables() as $var) {
                 foreach ($var->getIndicadores() as $ind) {
                     // Se actualiza el campo ultima lectura del indicador
                     $ind->setUltimaLectura(new \DateTime("now"));
                     $this->em->persist($ind);
                     $this->em->flush();
                     $fichaTec = $this->em->find('IndicadoresBundle:FichaTecnica', $ind->getId());
                     $fichaRepository = $this->em->getRepository('IndicadoresBundle:FichaTecnica');
                     $fichaRepository->crearCamposIndicador($fichaTec);
                     if (!$fichaTec->getEsAcumulado()) {
                         $fichaRepository->crearIndicador($fichaTec);
                     }
                 }
             }
             $ahora = new \DateTime("now");
             foreach ($origenDatos->getVariables() as $var) {
                 foreach ($var->getIndicadores() as $ind) {
                     $ind->setUltimaLectura($ahora);
                 }
             }
         } catch (\Exception $exc) {
             $origenDatos = $this->em->find('IndicadoresBundle:OrigenDatos', $msg['id_origen_dato']);
             // Crear el registro para el reporte de actualizacion
             $reporteActualizacion = new ReporteActualizacion();
             $reporteActualizacion->setOrigenDatos($origenDatos);
             $reporteActualizacion->setEstatusAct($this->em->find('IndicadoresBundle:EstatusActualizacion', 2));
             $reporteActualizacion->setFecha(new \DateTime('now'));
             $reporteActualizacion->setReporte($exc->getMessage());
             $this->em->persist($reporteActualizacion);
             $this->em->flush();
             return false;
         }
         return true;
     }
 }
 public function batchActionLoadData($idx = null, $dir = "")
 {
     //Mardar a la cola de carga de datos cada origen seleccionado
     $parameterBag = $this->get('request')->request;
     $em = $this->getDoctrine()->getManager();
     if (!$parameterBag->get('all_elements')) {
         $selecciones = $idx == null ? $parameterBag->get('idx') : $idx;
     } else {
         $selecciones = $em->getRepository('IndicadoresBundle:OrigenDatos')->findAll();
     }
     foreach ($selecciones as $origen) {
         if (!$parameterBag->get('all_elements')) {
             $origenDato = $em->find('IndicadoresBundle:OrigenDatos', $origen);
         } else {
             $origenDato = $origen;
         }
         // Recuperar el nombre y significado de los campos del origen de datos
         $campos_sig = array();
         $campos = $origenDato->getCampos();
         foreach ($campos as $campo) {
             $campos_sig[$campo->getNombre()] = $campo->getSignificado()->getCodigo();
         }
         if ($origenDato->getActualizacionIncremental()) {
             $limites = NULL;
             // Obtener todos los campos del origen de datos
             // es necesario para la carga incremental
             $objsCampos = $origenDato->getCampos();
             $ordenTiempo = $this->container->getParameter('tiempo');
             $campos = array();
             foreach ($objsCampos as $campo) {
                 $campos[$campo->getSignificado()->getCodigo()] = $campo->getNombre();
             }
             $maxCampoSuperior = '';
             $maxCampoInferior = '';
             $sqlCampoSuperior = '';
             $sqlCampoInferior = '';
             foreach ($ordenTiempo as $tiempo) {
                 if (empty($maxCampoSuperior)) {
                     if (array_key_exists($tiempo, $campos)) {
                         $maxCampoSuperior = $tiempo;
                         $sqlCampoSuperior = $campos[$tiempo];
                     }
                 }
                 if (array_key_exists($tiempo, $campos)) {
                     $maxCampoInferior = $tiempo;
                     $sqlCampoInferior = $campos[$tiempo];
                 }
             }
             $sql = 'SELECT 
                         MAX(CAST (datos->\'' . $maxCampoSuperior . '\' AS INTEGER)) AS val_superior,
                         MAX(CAST (datos->\'' . $maxCampoInferior . '\' AS INTEGER)) AS val_inferior
                     FROM fila_origen_dato WHERE id_origen_dato = ' . $origen;
             $result = $this->getDoctrine()->getManager()->getConnection()->executeQuery($sql)->fetchAll();
             if (!empty($result)) {
                 $maxValorSuperior = $result[0]['val_superior'];
                 $maxValorInferior = $result[0]['val_inferior'];
                 if ($maxCampoSuperior == 'anio' && $maxCampoInferior == 'id_mes' && $maxValorInferior == 12) {
                     //$maxValorSuperior++;
                     $maxValorInferior = 0;
                 }
                 if ($maxCampoSuperior == $maxCampoInferior) {
                     $maxCampoInferior = null;
                     $maxValorInferior = null;
                 }
                 $limites = array('campoSuperior' => $sqlCampoSuperior, 'valorSuperior' => $maxValorSuperior, 'campoInferior' => $sqlCampoInferior, 'valorInferior' => $maxValorInferior);
             }
         }
         $msg = array('id_origen_dato' => $origen, 'sql' => $origenDato->getSentenciaSql(), 'campos_significados' => $campos_sig, 'es_incremental' => $origenDato->getActualizacionIncremental(), 'limites' => $limites);
         $ahora = new \DateTime("now");
         foreach ($origenDato->getVariables() as $var) {
             foreach ($var->getIndicadores() as $ind) {
                 $ind->setUltimaLectura($ahora);
             }
         }
         $em->flush();
         $carga_directa = $origenDato->getEsCatalogo();
         // No mandar a la cola de carga los que son catálogos, Se cargarán directamente
         if ($carga_directa) {
             $mess = $em->getRepository('IndicadoresBundle:OrigenDatos')->cargarCatalogo($origenDato);
             if ($mess !== true) {
                 $this->addFlash('sonata_flash_error', $mess);
                 // Crear el registro para el reporte de actualizacion
                 $reporteActualizacion = new ReporteActualizacion();
                 $reporteActualizacion->setOrigenDatos($origenDato);
                 $reporteActualizacion->setEstatusAct($em->find('IndicadoresBundle:EstatusActualizacion', 2));
                 $reporteActualizacion->setFecha(new \DateTime('now'));
                 $reporteActualizacion->setReporte($mess);
                 $em->persist($reporteActualizacion);
                 $em->flush();
                 if ($dir == "") {
                     return new RedirectResponse($this->admin->generateUrl('list', $this->admin->getFilterParameters()));
                 }
             } else {
                 // Crear el registro para el reporte de actualizacion
                 $reporteActualizacion = new ReporteActualizacion();
                 $reporteActualizacion->setOrigenDatos($origenDato);
                 $reporteActualizacion->setEstatusAct($em->find('IndicadoresBundle:EstatusActualizacion', 1));
                 $reporteActualizacion->setFecha(new \DateTime('now'));
                 $reporteActualizacion->setReporte('Actualizacion correcta');
                 $em->persist($reporteActualizacion);
                 $em->flush();
             }
         } else {
             $this->get('old_sound_rabbit_mq.cargar_origen_datos_producer')->publish(serialize($msg));
         }
     }
     $this->addFlash('sonata_flash_success', $this->get('translator')->trans('flash_batch_load_data_success'));
     if ($dir == "") {
         return new RedirectResponse($this->admin->generateUrl('list', $this->admin->getFilterParameters()));
     } else {
         return $this->get('translator')->trans('flash_batch_load_data_success');
     }
 }