/// <summary> /// Realiza la validación de un usuario y asesión activa en dispositivo móvil /// </summary> /// <param name="id_movimiento_asignacion_recurso">Id de Asignación de recurso</param> /// <param name="id_compania">Id de Compañía donde se encuentra el recurso</param> /// <param name="token_fcm">Token de Firebase Cloud Messaging</param> /// <returns></returns> private RetornoOperacion validaUsuarioSesionActivaRecurso(int id_movimiento_asignacion_recurso, out int id_compania, out int id_recurso, out MovimientoAsignacionRecurso.Tipo tipo_recurso, out string token_fcm) { //Inicializando retorno RetornoOperacion resultado = new RetornoOperacion("Sesión Activa Encontrada.", true); //Inicializando parámetros de salida id_compania = id_recurso = 0; tipo_recurso = MovimientoAsignacionRecurso.Tipo.Operador; token_fcm = ""; //Instanciando asignación using (MovimientoAsignacionRecurso asignacion = new MovimientoAsignacionRecurso(id_movimiento_asignacion_recurso)) { //Definiendo objeto usuario sin asignar Usuario usuario = null; //Para el tipo de asignación correspondiente switch (asignacion.TipoMovimientoAsignacion) { case MovimientoAsignacionRecurso.Tipo.Operador: //Instanciando operador using (Operador op = new Operador(asignacion.id_recurso_asignado)) { //Obteniendo usuario en cuestión usuario = Usuario.ObtieneUsuarioAsignadoOperador(op.id_operador); id_compania = op.id_compania_emisor; id_recurso = op.id_operador; } break; case MovimientoAsignacionRecurso.Tipo.Tercero: //TODO: Implementar obtención de token FCM de dispositivo asignado al tercero break; case MovimientoAsignacionRecurso.Tipo.Unidad: //TODO: Implementar obtención de token FCM de dispositivo asignado a la unidad break; } //Validando existencia de usuario if (usuario != null) { //Validando sesión activa en algún dispositivo if (Validacion.ValidaOrigenDatos(UsuarioSesion.ObtieneSesionesActivasUsuario(usuario.id_usuario, UsuarioSesion.TipoDispositivo.Android))) { //Recuperando referencia del token de usuario using (DataTable mit = Referencia.CargaReferencias(usuario.id_usuario, 30, ReferenciaTipo.ObtieneIdReferenciaTipo(id_compania, 30, "Token FCM", 0, "Configuración"))) token_fcm = mit != null ? mit.Rows[0]["Valor"].ToString() : ""; //Si no obtuvo el token del usuario correspondiente if (token_fcm == "") { resultado = new RetornoOperacion("El token del dispositivo del usuario debe ser actualizado."); } } //Si no hay sesiones activas else { resultado = new RetornoOperacion("El usuario no cuenta con una sesión activa en dispositivo móvil."); } } //Si no hay un usuario asiciado else { resultado = new RetornoOperacion("No hay un usuario asociado al recurso."); } } //Devolviendo resultado return(resultado); }
/// <summary> /// Actualiza el token de dispositivo, asignado para servicios FCM /// </summary> /// <param name="id_usuario_sesion">Id de Sesión de Usuario</param> /// <returns></returns> private RetornoOperacion actualizaTokenFireBaseCloudMessaging(int id_usuario_sesion, string token) { //Declarando objeto de resultado RetornoOperacion resultado = new RetornoOperacion(id_usuario_sesion); //Inicializando bloque transaccional using (TransactionScope scope = Transaccion.InicializaBloqueTransaccional(System.Transactions.IsolationLevel.ReadCommitted)) { //Instanciando sesión solicitada using (UsuarioSesion sesion = new UsuarioSesion(id_usuario_sesion)) { //Validando estatus de sesión if (sesion.EstatusSesion == UsuarioSesion.Estatus.Activo) { //Obteniendo Referencia de token existente para el registro de usuario de la sesión using (DataTable mitTokenActual = Referencia.CargaReferencias(sesion.id_usuario, 30, ReferenciaTipo.ObtieneIdReferenciaTipo(0, 30, "Token FCM", 0, "Configuración"))) { //Si existe alguna if (mitTokenActual != null) { //Verificando existencia de esta misma referencia using (Referencia tokenDuplicado = new Referencia(token, ReferenciaTipo.ObtieneIdReferenciaTipo(sesion.id_compania_emisor_receptor, 30, "Token FCM", 0, "Configuración"))) { //Si hay alguna existente que no sea la referencia del token actual a editar if (tokenDuplicado.id_referencia > 0 && tokenDuplicado.id_referencia != Convert.ToInt32(mitTokenActual.Rows[0]["Id"])) { //Verificando si está asignado a un usuario con sesiones móviles activas if (UsuarioSesion.ObtieneSesionesActivasUsuario(tokenDuplicado.id_registro, UsuarioSesion.TipoDispositivo.Android) != null) { //Señalando error resultado = new RetornoOperacion(String.Format("El Token está asignado a una sesión activa de '{0}', cierre la sesión antes de continuar.", new SAT_CL.Seguridad.Usuario(tokenDuplicado.id_registro).nombre)); } //Si no hay asignación else { //Borrando el token del usuario anterior resultado = Referencia.EditaReferencia(tokenDuplicado.id_referencia, "", sesion.id_usuario); } } } //Si no hay errores if (resultado.OperacionExitosa) { //Editando registro previo resultado = Referencia.EditaReferencia(Convert.ToInt32(mitTokenActual.Rows[0]["Id"]), token, sesion.id_usuario); } else { resultado = new RetornoOperacion(String.Format("Error al borrar Token anterior: {0}", resultado.Mensaje)); } } //Si no existe alguna else { //Insertando nuevo elemento resultado = Referencia.InsertaReferencia(sesion.id_usuario, 30, ReferenciaTipo.ObtieneIdReferenciaTipo(sesion.id_compania_emisor_receptor, 30, "Token FCM", 0, "Configuración"), token, Fecha.ObtieneFechaEstandarMexicoCentro(), sesion.id_usuario); } } } //Si la sesión ya no se encuentra activa else { resultado = new RetornoOperacion("La Sesión ha Expirado."); } } //Si no hay errores if (resultado.OperacionExitosa) { scope.Complete(); } } //Devolviendo resultado return(resultado); }
/// <summary> /// Notificación para pedir ubicación actual al dispositivo /// </summary> /// <param name="tipo_recurso">Tipo de Recurso</param> /// <param name="id_recurso">Id de Entidad acorde al tipo indicado</param> /// <returns></returns> public RetornoOperacion NotificacionPeticionUbicacion(MovimientoAsignacionRecurso.Tipo tipo_recurso, int id_recurso) { //Declrando objeto de resultado RetornoOperacion resultado = new RetornoOperacion(); //Inicializando variables auxiliares string tokenFCM = ""; int idCompania = 0; Usuario usuario = null; //En base al tipo de recurso switch (tipo_recurso) { case MovimientoAsignacionRecurso.Tipo.Operador: //Instanciando el recurso using (Operador op = new Operador(id_recurso)) { //Guardando id de compañía idCompania = op.id_compania_emisor; //Recuperando Usuario correspondiente usuario = Usuario.ObtieneUsuarioAsignadoOperador(op.id_operador); } break; case MovimientoAsignacionRecurso.Tipo.Unidad: //Instanciando Unidad using (Unidad unidad = new Unidad(id_recurso)) { //recuperando Id de Compañía idCompania = unidad.id_compania_emisor; //Instanciando tipo de unidad using (UnidadTipo tipo = new UnidadTipo(unidad.id_tipo_unidad)) { //Si la unidad es motriz if (tipo.bit_motriz) { //Determiando la propiedad de unidad //Si no es propia if (unidad.bit_no_propia) { } //Si lo es else { //Buscando asignación de operador activa int idOperador = AsignacionOperadorUnidad.ObtieneOperadorAsignadoAUnidad(id_recurso); //Recuperando Usuario correspondiente usuario = Usuario.ObtieneUsuarioAsignadoOperador(idOperador); } } } } break; } //Si hay compañía y usuario if (idCompania > 0 && usuario != null) { //Validando configuración de notificaciones resultado = CompaniaEmisorReceptor.ValidaConfiguracionUsoAplicacionMovil(idCompania); //Si se configuró el uso de aplicación móvil if (resultado.OperacionExitosa) { //Validando sesión activa en algún dispositivo if (Validacion.ValidaOrigenDatos(UsuarioSesion.ObtieneSesionesActivasUsuario(usuario.id_usuario, UsuarioSesion.TipoDispositivo.Android))) { //Recuperando referencia del token de usuario using (DataTable mit = Referencia.CargaReferencias(usuario.id_usuario, 30, ReferenciaTipo.ObtieneIdReferenciaTipo(idCompania, 30, "Token FCM", 0, "Configuración"))) tokenFCM = mit != null ? mit.Rows[0]["Valor"].ToString() : ""; //Si se obtuvo el token del usuario correspondiente if (tokenFCM != "") { //Armando mensaje de petición var datos = new { Titulo = "Comando de Ubicación", Mensaje = "N/D", TipoNotificacion = "Ubicacion" }; //Enviando mensaje vía FCM resultado = FirebaseCloudNotifications.EnviaMensajeFCM(_url_servidor_fcm, _server_token_fcm, tokenFCM, FirebaseCloudNotifications.Prioridad.Alta, datos); } //Si no hay token else { resultado = new RetornoOperacion("El token del dispositivo del usuario debe ser actualizado."); } } //Si no hay sesión activa else { resultado = new RetornoOperacion("El usuario no cuenta con una sesión activa en dispositivo móvil."); } } } //Si no hay compañía o usuario else { resultado = new RetornoOperacion("No se localizó la compañía o el usuario asignado al recurso."); } //Si el resultado es correcto if (resultado.OperacionExitosa) { resultado = new RetornoOperacion("Petición enviada correctamente, el tiempo de respuesta puede variar de un dispositivo a otro y verse afectado por la calidad de datos móviles.", true); } //Devolviendo resultado return(resultado); }