public Viaje CancelarViaje(int idUsuario) { //OBTENGO EL ULTIMO VIAJE DEL USUARIO var query = (from viaje in _viajes.AsQueryable <Viaje>() where viaje.IdUsuario == idUsuario orderby viaje.FechaInicio descending select viaje).FirstOrDefault(); //VERIFICO QUE EL ULTIMO VIAJE DEL USUARIO ESTE FINALIZADO if (query.Estado == "Pendiente") { //OBTENGO EL VEHICULO bl.VehiculoController controladorVehiculo = new bl.VehiculoController(); var vehiculo = controladorVehiculo.ObtenerVehiculo(query.IdEmpresa, query.IdVehiculo); //MODIFICO ESTADO DEL VEHICULO vehiculo.Estado = "Disponible"; controladorVehiculo.ModificarVehiculo(query.IdEmpresa, vehiculo); query.Estado = "Cancelado"; //ZONA HORARIA MONTEVIDEO TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Montevideo Standard Time"); DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, cstZone); DateTime fechaReserva = query.FechaInicio; TimeSpan diferencia = cstTime.Subtract(fechaReserva); //DOY 3 MINUTOS PARA CANCELAR EL VIAJE SIN COBRAR if (diferencia.TotalMinutes >= 3) { //SE LE COBRA LA TARIFA FIJA DEL VEHICULO TipoVehiculoEmpresaController controladorTipoVehiculoEmpresa = new TipoVehiculoEmpresaController(); query.Precio = controladorTipoVehiculoEmpresa.ObtenerTarifaFijaTipoVehiculo(query.IdEmpresa, vehiculo.IdTipoVehiculo); //OBTENGO COMISION A COBRARLE A LA EMPRESA bl.EmpresaController controladorEmpresa = new EmpresaController(); var comisionEmpresa = controladorEmpresa.ObtenerComisionEmpresa(query.IdEmpresa); var montoFinalEmpresa = Math.Round(query.Precio - (query.Precio * comisionEmpresa / 100), 2); PagoEmpresa _pagoEmpresa = new PagoEmpresa { ViajeFinalizado = query, Comision = Math.Round((query.Precio - montoFinalEmpresa), 2), Acreditado = "NO", CobroEmpresa = montoFinalEmpresa }; _pagoAEmpresas.InsertOne(_pagoEmpresa); //ENVIO DE MAIL AL USUARIO UsuarioController controladorUsuario = new UsuarioController(); var usuario = controladorUsuario.ObtenerUsuario(query.IdUsuario); var apiKey = System.Environment.GetEnvironmentVariable("SENDGRID_APIKEY"); var client = new SendGridClient(apiKey); var msg = new SendGridMessage(); msg.SetFrom(new EmailAddress("*****@*****.**", "Urban_Move")); var recipients = new List <EmailAddress> { new EmailAddress(usuario.Email, usuario.Nombre), }; msg.AddTos(recipients); msg.SetSubject("Viaje Cancelado"); var body = "Estimado/a " + usuario.Nombre + " " + usuario.Apellido + "\n\nLe agradecemos su preferencia!! \n\n" + "Al pasarse del tiempo permitido para Cancelar, se genero un costo de $ " + query.Precio.ToString() + ".\n" + "Correspondiente a la tarifa fija del vehiculo reservado.\n\n" + "Puede ingresar en el enlace a continuacion para abonar y poder seguir utilizando nuestros servicios.\n\n" + "Gestion de Pago: http://urbanmove.azurewebsites.net/pagar \n\n" + "Utilizar PayPal: http://urbanmove.azurewebsites.net/pay \n\n" + "Lo saluda atentamente el equipo de Urban Move."; msg.AddContent(MimeType.Text, body); var response = client.SendEmailAsync(msg); } //GRABO LOS CAMBIOS EN EL VIAJE this.Update(query.InternalId, query); return(query); } else { return(null); } }
public string FinalizarViaje(int idEmpresa, int idVehiculo, string codigo) { string mensaje; //OBTENGO EL VIAJE var query = (from viaje in _viajes.AsQueryable <Viaje>() where viaje.IdVehiculo == idVehiculo && viaje.IdEmpresa == idEmpresa && viaje.CodigoReserva == codigo select viaje).First(); if ((query != null) && (query.Estado == "En Curso")) { //ULTIMA UBICACION DEL VEHICULO //UbicacionController controladorUbicacion = new UbicacionController(); //var ultUbicacionVehiculo = controladorUbicacion.UltimaUbicacion(idVehiculo, idEmpresa); var ultUbicacionVehiculo = (from ubicacion in _ubicacionesVehiculos.AsQueryable <UbicacionVehiculo>() where ubicacion.IdVehiculo == idVehiculo && ubicacion.IdEmpresa == idEmpresa orderby ubicacion.Fecha descending select ubicacion).FirstOrDefault(); //OBTENGO EL VEHICULO bl.VehiculoController controladorVehiculo = new bl.VehiculoController(); var vehiculo = controladorVehiculo.ObtenerVehiculo(idEmpresa, idVehiculo); //OBTENGO DATOS DEL TIPO DE VEHICULO PARA OBTENER ZONA bl.TipoVehiculoEmpresaController controladorTipoVehiculoEmpresa = new bl.TipoVehiculoEmpresaController(); var tipoVehiculoEmp = controladorTipoVehiculoEmpresa.ObtenerTipoDeVehiculo(idEmpresa, vehiculo.IdTipoVehiculo); //OBTENGO LA ZONA DEL VEHICULO //ZonaVehiculoController controladorZona = new ZonaVehiculoController(); //var zonaTipoVehiculo = controladorZona.ZonaVehiculoEmpresa(idEmpresa, tipoVehiculoEmp.ID); var zonaTipoVehiculo = (from zona in _zonas.AsQueryable <ZonaVehiculo>() where zona.IdEmpresa == idEmpresa && zona.IdTipoVehiculo == tipoVehiculoEmp.ID orderby zona.Fecha descending select zona).FirstOrDefault(); //VERIFICO QUE ESTE DENTRO DE LA ZONA if (this.EstaEnLaZona(zonaTipoVehiculo, ultUbicacionVehiculo)) { //ZONA HORARIA MONTEVIDEO TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Montevideo Standard Time"); DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, cstZone); query.FechaFin = cstTime; query.Estado = "Finalizado"; //MODIFICO ESTADO DEL VEHICULO vehiculo.Estado = "Disponible"; controladorVehiculo.ModificarVehiculo(idEmpresa, vehiculo); //CALCULAR PRECIO FINAL DEL VIAJE /* bl.TipoVehiculoEmpresaController controladorTipoVehiculoEmpresa = new bl.TipoVehiculoEmpresaController(); * var tipoVehiculoEmp = controladorTipoVehiculoEmpresa.ObtenerTipoDeVehiculo(idEmpresa, vehiculo.IdTipoVehiculo);*/ //EMPIEZO SUMANDO LA TARIFA FIJA DEL TIPOVEHICULOEMPRESA //var precioFinalViaje = tipoVehiculoEmp.TarifaFija; query.Precio = tipoVehiculoEmp.TarifaFija; //CALCULO TIEMPO DE VIAJE EN MINUTOS var difMinutos = query.FechaFin - query.FechaInicio; query.Precio += Math.Round(Convert.ToDouble(difMinutos.TotalMinutes * tipoVehiculoEmp.TarifaPorMinuto), 2); //CALCULO RECORRIDO DEL VIAJE var trayectoria = (from ubicacion in _ubicacionesVehiculos.AsQueryable <UbicacionVehiculo>() where ubicacion.IdVehiculo == idVehiculo && ubicacion.IdEmpresa == idEmpresa && ubicacion.Fecha >= query.FechaInicio && ubicacion.Fecha <= query.FechaFin orderby ubicacion.Fecha select ubicacion).ToList(); int numerador = 0; double diferenciaLat = 0; double diferenciaLng = 0; double distancia = 0; foreach (UbicacionVehiculo ubicacion in trayectoria) { //(Fórmula de Haversine) PARA EL CALCULO DE DISTANCIAS ENTRE COORDENADAS if (numerador < (trayectoria.Count() - 1)) { diferenciaLat = Convert.ToSingle(Math.PI / 180) * (Convert.ToDouble(ubicacion.Coordenadas.Lat - trayectoria[numerador + 1].Coordenadas.Lat)); diferenciaLng = Convert.ToSingle(Math.PI / 180) * (Convert.ToDouble(ubicacion.Coordenadas.Lng - trayectoria[numerador + 1].Coordenadas.Lng)); var a = Math.Pow(Math.Sin(diferenciaLat / 2), 2) + Math.Cos(Convert.ToDouble(Math.PI / 180) * ubicacion.Coordenadas.Lat) * Math.Cos(Convert.ToDouble(Math.PI / 180) * trayectoria[numerador + 1].Coordenadas.Lat) * Math.Pow(Math.Sin(diferenciaLng / 2), 2); var d = 1 - a; var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(d)); distancia = 6378.0F * Convert.ToSingle(c); numerador++; } } query.Precio += Math.Round(distancia * tipoVehiculoEmp.TarifaPorKm, 2); query.Precio = Math.Round(query.Precio, 2); //GRABO EL PRECIO DEL VIAJE this.Update(query.InternalId, query); //OBTENGO COMISION A COBRARLE A LA EMPRESA bl.EmpresaController controladorEmpresa = new EmpresaController(); var comisionEmpresa = controladorEmpresa.ObtenerComisionEmpresa(idEmpresa); var montoFinalEmpresa = Math.Round(query.Precio - (query.Precio * comisionEmpresa / 100), 2); PagoEmpresa _pagoEmpresa = new PagoEmpresa { ViajeFinalizado = query, Comision = Math.Round((query.Precio - montoFinalEmpresa), 2), Acreditado = "NO", CobroEmpresa = montoFinalEmpresa }; _pagoAEmpresas.InsertOne(_pagoEmpresa); //DEVUELVO EN EL MENSAJE EL PRECIO DEL VIAJE mensaje = query.Precio.ToString(); try { //ENVIO DE MAIL AL USUARIO UsuarioController controladorUsuario = new UsuarioController(); var usuario = controladorUsuario.ObtenerUsuario(query.IdUsuario); var apiKey = System.Environment.GetEnvironmentVariable("SENDGRID_APIKEY"); var client = new SendGridClient(apiKey); var msg = new SendGridMessage(); msg.SetFrom(new EmailAddress("*****@*****.**", "Urban_Move")); var recipients = new List <EmailAddress> { new EmailAddress(usuario.Email, usuario.Nombre), //new EmailAddress("*****@*****.**", "Urban_Move"), }; msg.AddTos(recipients); msg.SetSubject("Viaje Finalizado"); var body = "Estimado/a " + usuario.Nombre + " " + usuario.Apellido + "\n\nLe agradecemos su preferencia!! \n\n" + "El costo de su viaje asciende a $ " + query.Precio.ToString() + ".\n" + "Puede ingresar en el enlace a continuacion para abonar y poder seguir utilizando nuestros servicios.\n\n" + "Gestion de Pago: http://urbanmove.azurewebsites.net/pagar \n\n" + "Utilizar PayPal: http://urbanmove.azurewebsites.net/pay \n\n" + "Lo saluda atentamente el equipo de Urban Move."; msg.AddContent(MimeType.Text, body); var response = client.SendEmailAsync(msg); } catch (Exception e) { mensaje = e.Message; } } else { mensaje = "Z"; } } else if (query == null) { mensaje = "V"; } else { mensaje = "C"; } return(mensaje); }