/// <summary> /// Procesamiento de un pedido desde LENEL. En todos los casos, el pedido es reconocido, luego se envia una /// respuesta o muchasy se hace FLUSH. /// Inmediatamente despues de esta salida se DESCONECTARA al cliente. /// </summary> /// <param name="netStream"></param> /// <param name="v_buffer"></param> private void ProcesarPedidoLenel(NetworkStream netStream, byte[] v_buffer) { Match matchHeader; string texto = Encoding.Default.GetString(v_buffer).Replace("\0", ""); matchHeader = LNL_AddDevice.Match(texto); if (matchHeader.Success) { try { loguearString("Comando reconocido: " + texto); string deviceID = getMatchData(matchHeader, 1); string deviceName = getMatchData(matchHeader, 2); string organizationID = getMatchData(matchHeader, 3); loguearString("LNL_AddDevice: DeviceID: " + deviceID + " DeviceName: " + deviceName); AgregarDeviceDesdeLenel(deviceID, deviceName, organizationID); //string respuesta = "Agregado satisfactoriamente"; //respuesta = respuesta + "\n"; //netStream.Write(Encoding.Default.GetBytes(respuesta), 0, respuesta.Length); //netStream.Flush(); } catch (Exception e) { loguearString("Excepcion en LNL_AddDevice: " + e.Message); } return; } matchHeader = LNL_GetEventData.Match(texto); if (matchHeader.Success) { try { string LENELPanelID = getMatchData(matchHeader, 1); string serialNum = getMatchData(matchHeader, 2); loguearString("LNL_GetEventData: PanelID: " + LENELPanelID + " Serial: " + serialNum); string EventData = ObtenerDatosEvento(LENELPanelID, serialNum); byte[] datosFotoEmp = null; byte[] datosFotoEv = null; byte[] datosMapa = null; bool esValido = true; if (EventData != "FALSE") { //Expresion regular para extraer datos del EventData obtenido de la base matchHeader = LNL_DatosEvento.Match(EventData); if (matchHeader.Success) { string ImagenEmpleado = getMatchData(matchHeader, 11); string ImagenAcceso = getMatchData(matchHeader, 12); string Latitud = getMatchData(matchHeader, 9); string Longitud = getMatchData(matchHeader, 10); string Nombre = getMatchData(matchHeader, 2); datosFotoEmp = obtenerFotoEmp(ImagenEmpleado); datosFotoEv = obtenerFotoEv(ImagenAcceso); datosMapa = obtenerMapaEv(Latitud, Longitud, "16"); if (Nombre == "INVALIDO") { esValido = false; } } } enviarBulkData(Encoding.Default.GetBytes(EventData), datosFotoEmp, datosFotoEv, datosMapa,esValido); } catch (Exception e) { loguearString("Excepcion en LNL_GetEventData: " + e.Message); } return; } matchHeader = LNL_GetPosition.Match(texto); if (matchHeader.Success) { try { loguearString("Comando reconocido: " + texto); string LNLPanelID = getMatchData(matchHeader, 1); string organizationID = getMatchData(matchHeader, 2); string includeMap = getMatchData(matchHeader, 3); loguearString("LNL_GetPosition: PanelID:" + LNLPanelID + " ConMapa: " + includeMap); string encodedGPSPosition = mainApp.DataManager.obtenerUltimaPosicionGPS(LNLPanelID, organizationID); enviarPosicionGPS(encodedGPSPosition); if (encodedGPSPosition != dataManager.NO_LOCATION_DATA) // Solo envia el mapa si envio una posicion valida... { if (includeMap == "T") { enviarMapaAcceso(@"[LAT]", @"[LONG]", "16"); // El reemplazo de las coordenadas se realiza en el LENEL } } } catch (Exception e) { loguearString("Excepcion en LNL_GetPosition: " + e.Message); } return; } matchHeader = LNL_GetAcceso.Match(texto); if (matchHeader.Success) { try { string deviceID = getMatchData(matchHeader, 1); string deviceName = getMatchData(matchHeader, 2); string organizationID = getMatchData(matchHeader, 3); string serialNum = getMatchData(matchHeader, 4); //loguearString("LNL_GetAcceso: DeviceName:" + deviceName + " serial: " + serialNum); int idAcceso = 0; string fuente = ""; string accessToSend = ""; if (mainApp.ComunicationSystem.socketServerGeneral.isHandHeldOnLine(deviceName)) { accessToSend = ObtenerAccesoSinSerialNum(deviceName, organizationID, serialNum, ref idAcceso, ref fuente); } else { accessToSend = "FAIL"; } if (accessToSend != "") { if (accessToSend != "FAIL") { loguearString("Asignado SERIALNUM: " + serialNum + " a acceso " + idAcceso.ToString() + " de " + deviceName + ".Enviando a LENEL"); } ///Envia al Lenel Translator, el string con los datos para que se agregue el acceso en el AlarmMonitoring netStream.Write(Encoding.Default.GetBytes(accessToSend), 0, accessToSend.Length); netStream.Flush(); if (esperarConfirmacion(netStream)) // Not implementado: always true { if (fuente == "A") { ActualizarSerialNumEnAccesos(idAcceso, serialNum); } if (fuente == "V") { ActualizarSerialNumEnVisitas(idAcceso, serialNum); } } } else { string noData = ""; netStream.Write(Encoding.Default.GetBytes(noData), 0, noData.Length); } } catch (Exception e) { loguearString("Excepcion en LNL_GetAcceso: " + e.Message); } return; } matchHeader = LNL_AddReaderToPanel.Match(texto); if (matchHeader.Success) { try { loguearString("Comando reconocido: " + texto); string deviceID = getMatchData(matchHeader, 1); string deviceName = getMatchData(matchHeader, 2); string readerID = getMatchData(matchHeader, 3); string readerName = getMatchData(matchHeader, 4); string readerEntranceType = getMatchData(matchHeader, 5); //0: Indefinido, 1: Entrada, 2: Salida string organizationID = getMatchData(matchHeader, 6); loguearString("LNL_AddReaderToPanel. Panel: " + deviceID + " ReaderID: " + readerID + " Tipo: " + readerEntranceType); AgregarReaderLenel(deviceID, deviceName, readerID, readerName, readerEntranceType, organizationID); } catch (Exception e) { loguearString("Excepcion en LNL_AddReaderToPanel: " + e.Message); } return; } matchHeader = LNL_DelEmployee.Match(texto); if (matchHeader.Success) { try { string badge = getMatchData(matchHeader, 1); string LNLpanelID = getMatchData(matchHeader, 2); string LNLOrgID = getMatchData(matchHeader, 3); loguearString("LNL_DelEmployee. Panel: " + LNLpanelID + " badge: " + badge); int orgID = int.Parse(LNLOrgID); // Desasocia el empleado de la tarjeta de manera de sacarlo de la lista // de empleados que se enviara al HH mainApp.DataManager.borrarEmpleado(badge); string HHID = mainApp.DataManager.ObtenerHHID(LNLpanelID); if (HHID != "") { // DESCOMENTAR LA SIGUIENTE LINEA PARA BORRAR EMPLEADOS EN VEZ DE MANDAR LA LISTA ComunicationLayer.enviarBorrarEmpleado(badge, HHID); //enviarPedidoListaEmpleados(HHID); // Ok, enviar la nueva lista de empleados. INCLUYE el envio de AccessLevels //enviarAccessLevelsDefinitions(HHID, orgID); } } catch (Exception e) { loguearString("Excepcion en LNL_DelEmployee: " + e.Message); } return; } matchHeader = LNL_AddAccessLevel.Match(texto); if (matchHeader.Success) { try { int LNLpanelID = int.Parse(getMatchData(matchHeader, 1)); int orgID = int.Parse(getMatchData(matchHeader, 2)); int accessLevelID = int.Parse(getMatchData(matchHeader, 3)); string TZReaderData = getMatchData(matchHeader, 4); string isDownloadingDB = getMatchData(matchHeader, 5); loguearString("LNL_AddAccessLevel. Panel: " + LNLpanelID + " AccessLevelID:" + accessLevelID.ToString() + " ReadersTZ: " + TZReaderData); // Actualizar la info en el panel string HHID = mainApp.DataManager.ObtenerHHID(LNLpanelID.ToString()); string oldAllPersonIDs = mainApp.DataManager.loadAllPersonID(HHID); AccessLevelLogic.addAccessLevel(orgID, LNLpanelID, accessLevelID, TZReaderData); if (HHID != "") // Envío final de la nueva lista de empleados y las definiciones de los accessLevels { if (isDownloadingDB != "1") // Si no esta haciendo DownloadDB { string newAllPersonIDs = mainApp.DataManager.loadAllPersonID(HHID); ComunicationLayer.enviarListaEmpleadosDiferencia(HHID, oldAllPersonIDs, newAllPersonIDs); ComunicationLayer.enviarAccessLevelsDefinitions(HHID, orgID, isDownloadingDB); // Incluye un envio del ALLPersonIDs al final } } } catch (Exception e) { loguearString("Excepcion en LNL_AddAccessLevel: " + e.Message); } return; } matchHeader = LNL_SendEmployeeList.Match(texto); if (matchHeader.Success) { try { int LNLpanelID = int.Parse(getMatchData(matchHeader, 1)); int orgID = int.Parse(getMatchData(matchHeader, 2)); // Actualizar la info en el panel string HHID = mainApp.DataManager.ObtenerHHID(LNLpanelID.ToString()); if (HHID != "") // Evia efectivamente la lista de empleados. { ComunicationLayer.enviarPedidoListaEmpleados(HHID); // Actualizo la lista de empleados y el accesslevel del HH,INCLUYE el envio de AccessLevels //enviarAccessLevelsDefinitions(HHID, orgID); } } catch (Exception e) { loguearString("Excepcion en LNL_SendEmployeeList: " + e.Message); } return; } matchHeader = LNL_AddTimeZone.Match(texto); if (matchHeader.Success) { try { int LNL_PanelID = int.Parse(getMatchData(matchHeader, 1)); int organizationID = int.Parse(getMatchData(matchHeader, 2)); int TZNumber = int.Parse(getMatchData(matchHeader, 3)); string intervalData = getMatchData(matchHeader, 4); string isDownloadingDB = getMatchData(matchHeader, 5); loguearString("LNL_AddTimeZone. Panel: " + LNL_PanelID + " TZNumber:" + TZNumber.ToString() + " Interval: " + intervalData); //Agrego la nueva Time zone a Estructura en memoria y a la BD. AccessLevelLogic.addTimezone(organizationID, TZNumber, intervalData); // Actualizar la info en el panel string HHID = mainApp.DataManager.ObtenerHHID(LNL_PanelID.ToString()); if (HHID != "") // Envío final de la nueva lista de empleados y las definiciones de los accessLevels { if (isDownloadingDB != "1") { ComunicationLayer.enviarAccessLevelsDefinitions(HHID, organizationID,isDownloadingDB); } } } catch (Exception e) { loguearString("Excepcion en LNL_AddTimeZone: " + e.Message); } return; } matchHeader = LNL_AddHolidays.Match(texto); if (matchHeader.Success) { try { string LNLpanelID = getMatchData(matchHeader, 1); string idOrganization = getMatchData(matchHeader, 2); string holidaysData = getMatchData(matchHeader, 3); string isDownloadingDB = getMatchData(matchHeader, 4); int orgID = int.Parse(idOrganization); loguearString("LNL_AddHolidays. Panel: " + LNLpanelID + " datos:" + holidaysData); AccessLevelLogic.addLenelHolidays(idOrganization, holidaysData); // NOTA: En una sola llamada se definen TODAS las holidays para cada HH // Actualizar la info en el panel string HHID = mainApp.DataManager.ObtenerHHID(LNLpanelID); if (HHID != "") // Envío final de la nueva lista de empleados y las definiciones de los accessLevels { if (isDownloadingDB != "1") { ComunicationLayer.enviarAccessLevelsDefinitions(HHID, orgID,isDownloadingDB); } } } catch (Exception e) { loguearString("Excepcion en LNL_AddHolidays: " + e.Message); } return; } // Cambio en una badge de LENEL matchHeader = LNL_AddEmployee.Match(texto); if (matchHeader.Success) { try { int LNL_PanelID = int.Parse(getMatchData(matchHeader, 1)); string name = getMatchData(matchHeader, 2); string lastName = getMatchData(matchHeader, 3); string badge = getMatchData(matchHeader, 4); string empresa = getMatchData(matchHeader, 5); string SSNO = getMatchData(matchHeader, 6); string accessLevels = getMatchData(matchHeader, 7); // Lista de accessLevels asociados a la badge. string tieneFoto = getMatchData(matchHeader, 8); string LNLOrgID = getMatchData(matchHeader, 9); string isDownloadingDB = getMatchData(matchHeader, 10); string personID = getMatchData(matchHeader, 11); string idEventoEmp = getMatchData(matchHeader, 12); string lastChangedLNL = getMatchData(matchHeader, 13); string lastChanged = convertirFormatoHoraLNL(lastChangedLNL); string HHID = mainApp.DataManager.ObtenerHHID(LNL_PanelID.ToString()); int OrgID = int.Parse(LNLOrgID); string imageFileName = ""; empresa = ""; loguearString("LNL_AddEmployee: " + name + " " + lastName + " PANELID: " + LNL_PanelID.ToString()); bool aumentarVersion = false; if (tieneFoto == "T") // Recibe la foto del empleado { try { byte[] imageBytes = obtenerBufferconIDEvento(idEventoEmp, servidorDatos); if (imageBytes!=null) { int bytesFoto = imageBytes.Length; string pathImagenDB = mainApp.DataManager.cargarPathImagen(personID); // Si no hay imagen en la DB y ahora llegó una imagen, aumento la version del empleado if (pathImagenDB.Equals(string.Empty)) aumentarVersion = true;// mainApp.DataManager.aumentarIdImagen(personID);//aumentarVersionEmpleado(personID); else // Si hay imagen verifico que tenga el mismo largo { byte[] imgDB = obtenerFotoEmp(pathImagenDB); if (imgDB != null) { if (bytesFoto != imgDB.Length) aumentarVersion = true; // mainApp.DataManager.aumentarIdImagen(personID);//mainApp.DataManager.aumentarVersionEmpleado(personID); } } imageFileName = LNL_PanelID.ToString() + "_" + personID + ".jpg"; //imageFileName = LNL_PanelID.ToString() + "_" + badge + "_" + DateTime.Now.Year.ToString() + "_" + DateTime.Now.Month.ToString() + "_" + DateTime.Now.Day.ToString() + "_" + DateTime.Now.Hour.ToString() + "_" + DateTime.Now.Minute.ToString() + "_" + DateTime.Now.Second.ToString() + ".jpg"; string imagePath = SystemConfiguration.ImagesPath; File.WriteAllBytes(imagePath + @"\" + imageFileName, imageBytes); } } catch (Exception) { imageFileName = ""; // Excepcion: no recibe foto. } } int idNuevoEmpleado = mainApp.DataManager.addEmpleadoDesdeLenel(name, lastName, empresa, SSNO, @"~/Imagenes/" + imageFileName, OrgID, personID, isDownloadingDB, lastChanged); mainApp.DataManager.asociarEmpleadoATarjeta(badge, idNuevoEmpleado, OrgID); if (aumentarVersion) { mainApp.DataManager.aumentarIdImagen(personID); } if (!AccessLevelLogic.ListaBadgeAccessLevels.ContainsKey(OrgID)) { LENELBadgeAccessLevels nuevoLBACC = new LENELBadgeAccessLevels(OrgID); AccessLevelLogic.ListaBadgeAccessLevels.Add(OrgID, nuevoLBACC); } LENELBadgeAccessLevels LBACC = AccessLevelLogic.ListaBadgeAccessLevels[OrgID]; if (LBACC.asociarAccessLevel(badge, accessLevels)) // Si cambiaron los access levels asociados a la tarjeta mainApp.DataManager.aumentarVersionEmpleado(personID); // aumento la versión del empleado // Alta en la BD mainApp.DataManager.updateLenelBadgeAccessLevels(OrgID, badge, accessLevels); if (HHID != "") // Envio final del add o delete Empleado al HH. Puede ser un DELETE porque Lenel manda un addEmployee al QUITAR un accesslevel de una tarjeta { if (isDownloadingDB != "1") // Si esta llamada no es debida al DownloadDatabase, entonces enviar la lista al HH { try { string accesslevel = AccessLevelLogic.getAccessLevelsByBadgeInHH(badge, HHID); if (accesslevel.Trim().Length > 0) { ComunicationLayer.enviarAgregarUnEmpleado(badge, HHID); } else { ComunicationLayer.enviarBorrarEmpleado(badge, HHID); } } catch (Exception e) { loguearString("ERROR!! No se pudo agregar el empleado: " + e.Message); } //enviarPedidoListaEmpleados(HHID); // Actualizo la lista de empleados y el accesslevel del HH, INCLUYE el envio de AccessLevels //enviarAccessLevelsDefinitions(HHID, OrgID); } } } catch (Exception e) { loguearString("Excepcion en LNL_AddEmployee: " + e.Message); } return; } matchHeader = LNL_GetZoneMap.Match(texto); if (matchHeader.Success) { try { int LNL_PanelID = int.Parse(getMatchData(matchHeader, 1)); string idOrganization = getMatchData(matchHeader, 2); loguearString("Enviando el mapa de definicion de ZONAS para el panel " + LNL_PanelID.ToString()); string nombreZona = mainApp.DataManager.ObtenerHHID(LNL_PanelID.ToString()); // Envia el HTML con el mapa que contiene el javascript de definicion de zonas y ademas envia los datos de la zona actual enviarDatosZona(nombreZona,ObtenerMapaZonas(), obtenerDatosZona(LNL_PanelID, int.Parse(idOrganization))); } catch (Exception e) { loguearString("Excepcion en LNL_GetZoneMap: " + e.Message); } return; } matchHeader = LNL_GetOnlyZone.Match(texto); if (matchHeader.Success) { try { int LNL_PanelID = int.Parse(getMatchData(matchHeader, 1)); string idOrganization = getMatchData(matchHeader, 2); loguearString("Enviando datos de la zona: " + LNL_PanelID.ToString()); string nombreZona = mainApp.DataManager.ObtenerHHID(LNL_PanelID.ToString()); // Envia el HTML con el mapa que contiene el javascript de definicion de zonas y ademas envia los datos de la zona actual enviarDatosSoloZona(nombreZona,obtenerDatosZona(LNL_PanelID, int.Parse(idOrganization))); } catch (Exception e) { loguearString("Excepcion en LNL_GetOnlyZone: " + e.Message); } return; } matchHeader = LNL_DefineZone.Match(texto); if (matchHeader.Success) { try { int LNL_PanelID = int.Parse(getMatchData(matchHeader, 1)); int idOrganization = int.Parse(getMatchData(matchHeader, 2)); string listaPuntos = getMatchData(matchHeader, 3); loguearString("Actualizando definicion de zona de panelID: " + LNL_PanelID.ToString() + "con: " + listaPuntos); // Le saco la ultima coma del final listaPuntos = listaPuntos.Substring(0, listaPuntos.Length - 1); mainApp.DataManager.DefineNewZone(LNL_PanelID, listaPuntos, idOrganization); } catch (Exception e) { loguearString("Excepcion en LNL_DefineZone: " + e.Message); } return; } matchHeader = LNL_DefineGate.Match(texto); if (matchHeader.Success) { try { //("TYPE:LNL_DEFINEGATE,DEVICEID:(.*),READERID:(.*),ORGANIZATION:(.*),ACCESSTYPE:(.*),ORD1:(.*),ORD2:(.*)"); int LNL_PanelID = int.Parse(getMatchData(matchHeader, 1)); int LNL_ReaderID = int.Parse(getMatchData(matchHeader, 2)); int idOrganization = int.Parse(getMatchData(matchHeader, 3)); string accessType = getMatchData(matchHeader, 4); int Punto1=int.Parse(getMatchData(matchHeader, 5)); int Punto2= int.Parse(getMatchData(matchHeader, 6)); loguearString("Actualizando la Virtual Gate del LNLPanelID: " + LNL_PanelID.ToString() + ", ReaderID: " + LNL_ReaderID.ToString()); mainApp.DataManager.defineGate(LNL_PanelID,LNL_ReaderID,idOrganization,accessType,Punto1,Punto2); } catch (Exception e) { loguearString("Excepcion en LNL_DefineGate: " + e.Message); } return; } matchHeader = LNL_AddVirtualZoneFromLenel.Match(texto); if (matchHeader.Success) { try { int LNL_PanelID = int.Parse(getMatchData(matchHeader, 1)); string LNL_Panelname = getMatchData(matchHeader, 2); int idOrganization = int.Parse(getMatchData(matchHeader, 3)); loguearString("LNL_AddZONE: PanelID: " + LNL_PanelID.ToString() + " ZoneName: " + LNL_Panelname + "OrgID: " + idOrganization.ToString()); mainApp.DataManager.addZoneFromLenel(LNL_PanelID, LNL_Panelname, idOrganization); } catch (Exception e) { loguearString("Excepcion en LNL_AddVirtualZoneFromLenel: " + e.Message); } return; } //Regex(@"TYPE:LNL_ADDVIRTUALGATE,DEVICEID:(.*),DEVICENAME:(.*),READERID:(.*),READERNAME:(.*),READERENTRANCETYPE:(.*),ORGANIZATION:(.*)"); matchHeader = LNL_AddVirtualGateFromLenel.Match(texto); if (matchHeader.Success) { try { int LNL_PanelID = int.Parse(getMatchData(matchHeader, 1)); string LNL_Panelname = getMatchData(matchHeader, 2); // No se usa int LNL_ReaderID = int.Parse(getMatchData(matchHeader, 3)); string LNL_ReaderName = getMatchData(matchHeader, 4); string LNL_ReaderEntranceType = getMatchData(matchHeader, 5); // No se usa int idOrganization = int.Parse(getMatchData(matchHeader, 3)); mainApp.DataManager.addVirtualGateFromLenel(LNL_PanelID, LNL_ReaderID, LNL_ReaderName, idOrganization); } catch (Exception e) { loguearString("Excepcion en LNL_AddVirtualGateFomLenel: " + e.Message); } return; } matchHeader = LNL_CleanupDB.Match(texto); if (matchHeader.Success) { int idOrganization = int.Parse(getMatchData(matchHeader, 1)); string finishPanels = getMatchData(matchHeader, 2); // Lista de panels a enviar la lista de empelados nueva. string first = getMatchData(matchHeader, 3); // Si vale 1, entonces es la primera vez que se manda desde el constructor del translator // SOLO entonces proceder al borrado de empleados de la base. if (first == "1") { loguearString("Borrando lista de empleados no actualizados de la organizacion: " + idOrganization.ToString()); mainApp.DataManager.borrarListaPreviaEmpleados(idOrganization); } string [] idPanels = finishPanels.Split(','); for (int i =0 ; i<idPanels.Length;i++) { string HHID = mainApp.DataManager.ObtenerHHID(idPanels[i]); if (HHID != "") // Evia efectivamente la lista de empleados. { ComunicationLayer.enviarPedidoListaEmpleados(HHID); // Actualizo la lista de empleados y el accesslevel del HH,INCLUYE el envio de AccessLevels } } return; } matchHeader = LNL_GetConnectionStatus.Match(texto); // Devuelve true o False si el HH correspondiente al PANELID esta conectado if (matchHeader.Success) { string LNL_PanelID = getMatchData(matchHeader, 1); int idOrganization = int.Parse(getMatchData(matchHeader, 2)); try { string HHID = mainApp.DataManager.ObtenerHHID(LNL_PanelID); bool res = mainApp.ComunicationSystem.socketServerGeneral.isHandHeldOnLine(HHID); string resToSend = (res) ? "YES":"NO"; //resToSend = "YES"; netStream.Write(Encoding.Default.GetBytes(resToSend), 0, resToSend.Length); netStream.Flush(); //loguearString("Connection Status de " + HHID + ": " + resToSend); } catch (Exception ex) { loguearString("Excepcion en LNL_GetConnectionStatus: " + ex.Message); } return; } // Si llega aca es porque no pudo machear ninguna expresion regular loguearString("ATENCION: COMANDO NO RECONOCIDO: " + texto); }
// Lista de asociaciones de tarjetas a accesslevels para todas las organizaciones public Dictionary<int, LENELBadgeAccessLevels> LoadListaBadgeAccessLevels() { Dictionary<int, LENELBadgeAccessLevels> listaResultado = new Dictionary<int, LENELBadgeAccessLevels>(); SqlConnection cnn = new SqlConnection(conexion); try { cnn.Open(); SqlCommand cmd = cnn.CreateCommand(); cmd.CommandText = "select * from Tarjetas"; cmd.CommandType = CommandType.Text; SqlDataReader lector = cmd.ExecuteReader(); while (lector.Read()) { int idOrg = int.Parse(lector["idOrganizacion"].ToString()); if (!listaResultado.ContainsKey(idOrg)) { LENELBadgeAccessLevels nuevoAccessLevels = new LENELBadgeAccessLevels(idOrg); listaResultado.Add(idOrg, nuevoAccessLevels); } LENELBadgeAccessLevels accessLevels = listaResultado[idOrg]; long idTarjeta = long.Parse(lector["Tarjeta"].ToString()); string listaAccessLevels = lector["accessLevels"].ToString(); accessLevels.asociarAccessLevel(idTarjeta.ToString(), listaAccessLevels); } lector.Close(); } catch (Exception ex) { loguearString("Excepcion en LoadListaBadgeAccessLevels: " + ex.Message, TiposLOG.HH); } finally { cnn.Close(); } return listaResultado; }