public List <CourierDto> GetNearestCouriers(PointDto pointDto, int count = 5)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                var nearestPoints = db.ActivePointsRepo.Query
                                    .Where(point => (point.Courier != null && point.Courier.Deleted == null) || point.Route != null)
                                    .AsEnumerable()
                                    .OrderBy(point => point.Coordinates.Distance(new Point(pointDto.Longitude, pointDto.Latitude)))
                                    .ToList();

                var couriers = nearestPoints
                               .Select(point =>
                {
                    if (point.Courier != null)
                    {
                        return(point.Courier);
                    }
                    else
                    {
                        return(point.Route.Courier);
                    }
                })
                               .Where(courier => courier.State != CourierState.NotAccessible)
                               .Distinct()
                               .OrderBy(courier => courier.Orders.Count())
                               .ThenBy(courier => courier.State)
                               .Take(count)
                               .ToList();

                var couriersDto = Mapper.Map <List <CourierDto> >(couriers);

                return(couriersDto);
            }
        }
        public async Task <int> AddWarehouseAsync(WarehouseDto warehouseDto)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                if (warehouseDto.Location == null)
                {
                    throw new ArgumentException("Warehouse location is required!");
                }

                ActivePoint location = new ActivePoint
                {
                    Coordinates = new Point(warehouseDto.Location.Longitude, warehouseDto.Location.Latitude)
                };

                Warehouse warehouse = new Warehouse
                {
                    Location = location,
                    Address  = warehouseDto.Address,
                    Name     = warehouseDto.Name
                };

                db.WarehousesRepo.Create(warehouse);
                await db.SaveAsync();

                return(warehouse.Id);
            }
        }
Пример #3
0
        public async Task <List <OrderDto> > SyncOrders(Guid courierId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = db.CouriersRepo.Get(courierId);

                if (courier == null)
                {
                    throw new Exception();                     //todo: exception
                }

                List <Order> notSyncedOrders = courier.Orders.Where(o => o.Synced == null || o.Edited > o.Synced).ToList();

                foreach (var order in notSyncedOrders)
                {
                    order.Synced = DateTime.Now;
                    db.OrdersRepo.Update(order);
                }

                await db.SaveAsync();

                List <OrderDto> notSyncedOrdersDto = Mapper.Map <List <OrderDto> >(notSyncedOrders);

                return(notSyncedOrdersDto);
            }
        }
        public async Task CompleteCurrentRoute(Guid courierId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = db.CouriersRepo.Get(courierId);

                if (courier == null)
                {
                    throw new ArgumentException($"Can`t find courier with id {courierId}");
                }

                var route = courier.Routes.FirstOrDefault(r => r.IsCurrent);

                if (route == null)
                {
                    throw new Exception();                     //todo: exception
                }

                route.IsCurrent = false;
                route.Completed = DateTime.Now;

                db.RoutesRepo.Update(route);

                await db.SaveAsync();
            }
        }
        public async Task Update(WarehouseDto warehouseDto)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                if (warehouseDto.Location == null)
                {
                    throw new ArgumentException("Warehouse location is required!");
                }

                Warehouse warehouse = db.WarehousesRepo.Get(warehouseDto.Id);

                if (warehouse == null)
                {
                    throw new ArgumentOutOfRangeException("");                     //todo: make better exception
                }

                warehouse.Location.Coordinates = new Point(warehouseDto.Location.Longitude, warehouseDto.Location.Latitude);
                warehouse.Address = warehouseDto.Address;
                warehouse.Name    = warehouseDto.Name;

                db.WarehousesRepo.Update(warehouse);

                await db.SaveAsync();
            }
        }
Пример #6
0
        public async Task ChangeCourierCurrentRouteAsync(Guid courierId, RouteDto newCurrentRouteDto)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = db.CouriersRepo.Get(courierId);
                if (courier == null)
                {
                    throw new ArgumentException();                     //todo: exception
                }

                Route currentRoute = courier.Routes.FirstOrDefault(r => r.IsCurrent);

                foreach (var point in currentRoute.Points.ToList())
                {
                    db.ActivePointsRepo.Delete(point);
                }

                foreach (var point in newCurrentRouteDto.Points)
                {
                    currentRoute.Points.Add(new ActivePoint()
                    {
                        Coordinates = new Point(point.Longitude, point.Latitude)
                    });
                }

                db.RoutesRepo.Update(currentRoute);

                await db.SaveAsync();
            }
        }
        private void ChangeTrack(Courier courier, CourierHelperDb db)
        {
            if (courier.State > CourierState.Idle)
            {
                Track       currentTrack = courier.Tracks.FirstOrDefault(t => t.IsCurrent);
                ActivePoint newPoint     = new ActivePoint
                {
                    Coordinates = new Point(courier.Location.Coordinates.Longitude, courier.Location.Coordinates.Latitude)
                };

                if (currentTrack == null)
                {
                    currentTrack = new Track {
                        IsCurrent = true
                    };
                    currentTrack.Points.Add(newPoint);
                    courier.Tracks.Add(currentTrack);
                }
                else
                {
                    currentTrack.Points.Add(newPoint);
                    db.TracksRepo.Update(currentTrack);
                }
            }
        }
 public async Task DisableCourierAsync(Guid courierId)
 {
     using (var db = new CourierHelperDb(_connectionString))
     {
         db.CouriersRepo.Delete(courierId);
         await db.SaveAsync();
     }
 }
Пример #9
0
        public async Task DeleteOrder(long orderId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                db.OrdersRepo.Delete(orderId);

                await db.SaveAsync();
            }
        }
        public async Task UpdateCustomerAsync(CustomerDto customerDto)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Customer customer = Mapper.Map <Customer>(customerDto);
                db.CustomersRepo.Update(customer);

                await db.SaveAsync();
            }
        }
Пример #11
0
        public List <CourierDto> GetAllCouriers()
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                List <Courier> couriers = db.CouriersRepo.GetAll().ToList();

                List <CourierDto> couriersDto = Mapper.Map <List <CourierDto> >(couriers);

                return(couriersDto);
            }
        }
Пример #12
0
        public List <OrderDto> GetOrdersByState(OrderStateDto state)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                List <Order> orders = db.OrdersRepo.Query.Where(o => o.State == (OrderState)state).ToList();

                List <OrderDto> ordersDto = Mapper.Map <List <OrderDto> >(orders);

                return(ordersDto);
            }
        }
Пример #13
0
        public OrderDto GetOrderById(long orderId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Order order = db.OrdersRepo.Get(orderId);

                OrderDto orderDto = Mapper.Map <OrderDto>(order);

                return(orderDto);
            }
        }
        public List <WarehouseDto> GetAll()
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                List <Warehouse> warehouses = db.WarehousesRepo.GetAll().ToList();

                List <WarehouseDto> warehousesDto = Mapper.Map <List <WarehouseDto> >(warehouses);

                return(warehousesDto);
            }
        }
        public CustomerDto GetCustomerById(Guid customerId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Customer customer = db.CustomersRepo.Get(customerId);

                CustomerDto customerDto = Mapper.Map <CustomerDto>(customer);

                return(customerDto);
            }
        }
        public WarehouseDto GetById(int warehouseId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Warehouse warehouse = db.WarehousesRepo.Get(warehouseId);

                WarehouseDto warehouseDto = Mapper.Map <WarehouseDto>(warehouse);

                return(warehouseDto);
            }
        }
Пример #17
0
        public List <OrderDto> GetUnassignedOrders()
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                var orders = db.OrdersRepo.Query
                             .Where(order => order.Deleted == null && order.State == OrderState.NotAssigned)
                             .ToList();
                var ordersDto = Mapper.Map <List <OrderDto> >(orders);

                return(ordersDto);
            }
        }
Пример #18
0
        public List <RouteDto> GetCourierAllRoutes(Guid courierId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = db.CouriersRepo.Get(courierId);

                if (courier == null)
                {
                    throw new ArgumentOutOfRangeException("");                     //todo: exception
                }

                List <Route> routes = courier.Routes.ToList();

                List <RouteDto> routesDto = Mapper.Map <List <RouteDto> >(routes);

                return(routesDto);
            }
        }
Пример #19
0
        public RouteDto GetCourierCurrentRoute(Guid courierId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = db.CouriersRepo.Get(courierId);

                if (courier == null)
                {
                    throw new ArgumentOutOfRangeException("");                     //todo: exception
                }

                Route currentRoute = courier.Routes.FirstOrDefault(route => route.IsCurrent);

                RouteDto routeDto = Mapper.Map <RouteDto>(currentRoute);

                return(routeDto);
            }
        }
Пример #20
0
        public async Task ChangeCourierStateAsync(Guid courierId, CourierStateDto newState)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = db.CouriersRepo.Get(courierId);

                if (courier == null)
                {
                    throw new ArgumentException($"Can`t find courier with id {courierId}");
                }

                courier.State = (CourierState)newState;

                db.CouriersRepo.Update(courier);

                await db.SaveAsync();
            }
        }
Пример #21
0
        public List <OrderDto> GetCourierOrders(Guid courierId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                var courier = db.CouriersRepo.Get(courierId);

                if (courier == null)
                {
                    throw new ArgumentOutOfRangeException($"The courier with id {courierId} does not exist!");
                }

                var orders = courier.Orders.Where(o => o.Deleted == null).ToList();

                var ordersDto = Mapper.Map <List <OrderDto> >(orders);

                return(ordersDto);
            }
        }
Пример #22
0
        public async Task AssignOrder(Guid courierId, long orderId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = db.CouriersRepo.Get(courierId);
                Order   order   = db.OrdersRepo.Get(orderId);

                if (courier == null || order == null)
                {
                    throw new ArgumentOutOfRangeException("");                     //todo: exception
                }

                courier.Orders.Add(order);

                db.CouriersRepo.Update(courier);

                await db.SaveAsync();
            }
        }
Пример #23
0
        public async Task ChangeOrderStateAsync(OrderDto orderDto, OrderStateDto state)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Order order = db.OrdersRepo.Get(orderDto.Id);

                if (order == null)
                {
                    throw new ArgumentOutOfRangeException($"The order with id {orderDto.Id} does not exist!");
                }

                order.State = (OrderState)state;

                db.OrdersRepo.Update(order);
                await db.SaveAsync();

                orderDto.State = state;
            }
        }
Пример #24
0
        public async Task CompleteAsync(Guid courierId, long orderId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = db.CouriersRepo.Get(courierId);

                if (courier == null)
                {
                    throw new Exception();                    //todo: exception
                }

                Order order = courier.Orders.SingleOrDefault(o => o.Id == orderId);

                if (order == null)
                {
                    throw new Exception("The courier does not have this order");
                }

                Track currentTrack = courier.Tracks.Single(t => t.IsCurrent);
                currentTrack.IsCurrent = false;
                db.TracksRepo.Update(currentTrack);

                order.State = OrderState.Completed;
                order.Track = currentTrack;
                db.OrdersRepo.Update(order);

                if (!courier.Orders.Any(o => o.State == OrderState.Fulfillment))
                {
                    Route currentRoute = courier.Routes.SingleOrDefault(r => r.IsCurrent);
                    currentRoute.IsCurrent = false;
                    currentRoute.Completed = DateTime.Now;

                    db.RoutesRepo.Update(currentRoute);

                    courier.State = CourierState.Idle;

                    db.CouriersRepo.Update(courier);
                }

                await db.SaveAsync();
            }
        }
Пример #25
0
        public RouteDto GetCourieRemainingRoute(Guid courierId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = db.CouriersRepo.Get(courierId);
                if (courier == null)
                {
                    throw new ArgumentException();                     //todo: exception
                }

                if (courier.State < CourierState.PerformsDelivery)
                {
                    throw new Exception();                     //todo: exception
                }

                Route currentRoute = courier.Routes.Single(r => r.IsCurrent);

                return(null);                //todo: add logic for getting remaining route
            }
        }
Пример #26
0
        public async Task ChangeCourierLocationAsync(Guid courierId, PointDto newLocation)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = db.CouriersRepo.Get(courierId);

                if (courier == null)
                {
                    throw new ArgumentException($"Can`t find courier with id {courierId}");
                }

                courier.Location.Coordinates = new Point(newLocation.Longitude, newLocation.Latitude);

                SetState(courier);
                ChangeTrack(courier, db);

                db.CouriersRepo.Update(courier);

                await db.SaveAsync();
            }
        }
Пример #27
0
        public async Task <Guid> AddRouteAsync(Guid courierId, RouteDto newCurrentRoute)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = db.CouriersRepo.Get(courierId);

                if (courier == null)
                {
                    throw new ArgumentException();                     //todo: exception
                }

                if (courier.Routes.Any(r => r.IsCurrent))
                {
                    throw new Exception();                     //todo: exception
                }

                Route route = new Route
                {
                    Created   = DateTime.Now,
                    Edited    = DateTime.Now,
                    Synced    = DateTime.Now,
                    IsCurrent = true,
                    Distance  = newCurrentRoute.Distance
                };

                foreach (var point in newCurrentRoute.Points)
                {
                    route.Points.Add(new ActivePoint()
                    {
                        Coordinates = new Point(point.Longitude, point.Latitude)
                    });
                }

                courier.Routes.Add(route);

                await db.SaveAsync();

                return(route.Id);
            }
        }
Пример #28
0
        public PointDto GetOrderLocation(long orderId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                var order = db.OrdersRepo.Get(orderId);

                if (order == null)
                {
                    throw new ArgumentOutOfRangeException("The order with this id does not exist!");
                }

                Point    orderPoint    = order.Destination.Coordinates;
                PointDto orderPointDto = Mapper.Map <PointDto>(orderPoint);

                Point    warehousePoint    = order.Warehouse.Location.Coordinates;
                PointDto warehousePointDto = Mapper.Map <PointDto>(warehousePoint);

                orderPointDto.After = warehousePointDto;

                return(orderPointDto);
            }
        }
Пример #29
0
        public async Task <RouteDto> SyncRoute(Guid courierId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = db.CouriersRepo.Get(courierId);

                if (courier == null)
                {
                    throw new Exception();                     //todo: exception
                }

                Route notSyncedRoute = courier.Routes.Single(r => r.IsCurrent && (r.Synced == null || r.Edited > r.Synced));

                notSyncedRoute.Synced = DateTime.Now;

                db.RoutesRepo.Update(notSyncedRoute);

                await db.SaveAsync();

                RouteDto notSyncedRouteDto = Mapper.Map <RouteDto>(notSyncedRoute);

                return(notSyncedRouteDto);
            }
        }
Пример #30
0
        public async Task <Guid> AddCourierAsync(CourierDto courierDto)
        {
            if (string.IsNullOrWhiteSpace(courierDto.PhoneNumber))
            {
                throw new ArgumentException("Phone number is required");                 //todo: better exception
            }

            using (var db = new CourierHelperDb(_connectionString))
            {
                Courier courier = new Courier
                {
                    FirstName   = courierDto.FirstName,
                    LastName    = courierDto.LastName,
                    MiddleName  = courierDto.MiddleName,
                    Email       = courierDto.Email,
                    PhoneNumber = courierDto.PhoneNumber,
                    State       = (CourierState)courierDto.State
                };

                if (courierDto.Location != null)
                {
                    ActivePoint location = new ActivePoint
                    {
                        Coordinates = new Point(courierDto.Location.Longitude, courierDto.Location.Latitude)
                    };

                    courier.Location = location;
                }

                db.CouriersRepo.Create(courier);
                await db.SaveAsync();

                courierDto.Id = courier.Id;
                return(courier.Id);
            }
        }