コード例 #1
0
        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();
            }
        }
コード例 #2
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);
            }
        }
コード例 #3
0
        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();
            }
        }
コード例 #4
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();
            }
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
 public async Task DisableCourierAsync(Guid courierId)
 {
     using (var db = new CourierHelperDb(_connectionString))
     {
         db.CouriersRepo.Delete(courierId);
         await db.SaveAsync();
     }
 }
コード例 #7
0
        public async Task DeleteOrder(long orderId)
        {
            using (var db = new CourierHelperDb(_connectionString))
            {
                db.OrdersRepo.Delete(orderId);

                await db.SaveAsync();
            }
        }
コード例 #8
0
        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();
            }
        }
コード例 #9
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();
            }
        }
コード例 #10
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();
            }
        }
コード例 #11
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;
            }
        }
コード例 #12
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();
            }
        }
コード例 #13
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();
            }
        }
コード例 #14
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);
            }
        }
コード例 #15
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);
            }
        }
コード例 #16
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);
            }
        }
コード例 #17
0
        public async Task <long> AddOrderAsync(OrderDto orderDto)
        {
            if (orderDto.WarehouseId <= 0)
            {
                throw new ArgumentOutOfRangeException("Order must have related warehouse");
            }
            if (orderDto.Receiver == null)
            {
                throw new ArgumentNullException("Order receiver not set. Order must have receiver");
            }
            if (orderDto.Sender == null)
            {
                throw new ArgumentNullException("Order sender not set. Each order must have information about sender");
            }
            if (orderDto.Destination == null)
            {
                throw new ArgumentNullException("Order destination not set. Each order must have destination point");
            }

            using (var db = new CourierHelperDb(_connectionString))
            {
                Warehouse warehouse = db.WarehousesRepo.Query.FirstOrDefault(w => w.Id == orderDto.WarehouseId);

                if (warehouse == null)
                {
                    throw new ArgumentOutOfRangeException($"The warehouse warehouse with id {orderDto.WarehouseId}");
                }


                Customer sender = db.CustomersRepo.Query.FirstOrDefault(c => c.Id == orderDto.Sender.Id);
                if (sender == null)
                {
                    sender = Mapper.Map <Customer>(orderDto.Sender);

                    db.CustomersRepo.Create(sender);
                }
                else
                {
                    sender.Email       = orderDto.Sender.Email;
                    sender.FirstName   = orderDto.Sender.FirstName;
                    sender.MiddleName  = orderDto.Sender.MiddleName;
                    sender.PhoneNumber = orderDto.Sender.PhoneNumber;

                    db.CustomersRepo.Update(sender);
                }

                Customer receiver = db.CustomersRepo.Query.FirstOrDefault(c => c.Id == orderDto.Receiver.Id);
                if (receiver == null)
                {
                    receiver = Mapper.Map <Customer>(orderDto.Receiver);

                    db.CustomersRepo.Create(sender);
                }
                else
                {
                    receiver.Email       = orderDto.Receiver.Email;
                    receiver.FirstName   = orderDto.Receiver.FirstName;
                    receiver.MiddleName  = orderDto.Receiver.MiddleName;
                    receiver.PhoneNumber = orderDto.Receiver.PhoneNumber;

                    db.CustomersRepo.Update(receiver);
                }

                Order order = new Order
                {
                    State       = OrderState.NotAssigned,
                    Receiver    = receiver,
                    Sender      = sender,
                    Warehouse   = warehouse,
                    Destination = new ActivePoint {
                        Coordinates = new Point(orderDto.Destination.Longitude, orderDto.Destination.Latitude)
                    }
                };

                db.OrdersRepo.Create(order);

                await db.SaveAsync();

                return(order.Id);
            }
        }