Пример #1
0
        public Viaje Create(Viaje viaje)
        {
            UsuarioController controladorUsuario = new UsuarioController();
            var usuario = controladorUsuario.ObtenerUsuario(viaje.IdUsuario);

            if (usuario != null)
            {
                String _puedeReservar = this.PuedeReservar(viaje.IdUsuario);

                if (_puedeReservar == "OK")
                {
                    VehiculoController controladorVehiculo = new VehiculoController();
                    dal.Vehiculo       _vehiculo           = controladorVehiculo.ObtenerVehiculo(viaje.IdEmpresa, viaje.IdVehiculo);

                    if (_vehiculo.Estado == "Disponible")
                    {
                        //OBTENGO EL HORARIO DESDE TIPOVEHICULO EMPRESA
                        TipoVehiculoEmpresaController controladorTipoVehiculo = new TipoVehiculoEmpresaController();
                        dal.TipoVehiculoEmpresa       _tipoVehiculoEmp        = controladorTipoVehiculo.ObtenerTipoDeVehiculo(viaje.IdEmpresa, _vehiculo.IdTipoVehiculo);

                        TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Montevideo Standard Time");
                        DateTime     cstTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, cstZone);

                        //COMPRUEBO QUE LA HORA ESTE COMPRENDIDA EN LA DEL VEHICULO
                        if ((_tipoVehiculoEmp.HorarioInicio <= cstTime.Hour) && (cstTime.Hour <= _tipoVehiculoEmp.HorarioFin))
                        {
                            _vehiculo.Estado  = "Ocupado";
                            viaje.FechaInicio = cstTime;
                            Random rnd = new Random();
                            viaje.CodigoReserva = rnd.Next(1000, 9999).ToString();
                            viaje.Estado        = "Pendiente";
                            viaje.Precio        = 0;
                            viaje.Pago          = "NO";
                            viaje.Puntuacion    = 0;
                            viaje.Comentario    = "";

                            _viajes.InsertOne(viaje);
                            controladorVehiculo.ModificarVehiculo(viaje.IdEmpresa, _vehiculo);

                            return(viaje);
                        }
                        else
                        {
                            viaje.Estado = "2";
                            return(viaje);
                        }
                    }
                    else
                    {
                        viaje.Estado = "1";
                        return(viaje);
                    }
                }
                else if (_puedeReservar == "Pago Pendiente")
                {
                    viaje.Estado = "3";
                    return(viaje);
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                viaje.Estado = "4";
                return(viaje);
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
        }