public GroupTripOrder orderGroupTrip(GroupTrip groupTrip, PaymentType paymentType, Address orderAddress, User user)
        {
            if (!this.users.Contains(user))
            {
                return(null);
            }

            if (groupTrip == null || orderAddress == null || user == null || !this.canOrderGroupTrip(groupTrip))
            {
                return(null);
            }

            if (groupTrip.saveInDB() == null)
            {
                return(null);
            }

            GroupTripOrder groupTripOrder = new GroupTripOrder(paymentType, DateTime.Now, user, orderAddress, ++numOrders, groupTrip);

            DAL.Order value = groupTripOrder.saveInDB();

            if (value == null)
            {
                return(null);
            }

            // value.boatToursManagerId = 1;
            entity.numOrders = this.numOrders;
            db.SaveChanges();

            this.orders.Add(groupTripOrder.orderNumber, groupTripOrder);
            return(groupTripOrder);
        }
 public GroupTripOrder(DAL.Order order) : base(order)
 {
     this.groupTrip = new GroupTrip(order.GroupTrip);
 }
        public bool canOrderGroupTrip(GroupTrip groupTrip)
        {
            if (groupTrip == null)
            {
                return(false);
            }

            if (DateTime.Compare(groupTrip.depatureTime, DateTime.Today) < 0)
            {
                return(false);
            }

            if (groupTrip.getNumPersonsOnBoard() <= 0)
            {
                return(false);
            }

            List <PriceCategory> priceCategories = groupTrip.getPriceCategories();
            int priceCategoriesFound             = 0;

            foreach (PriceCategory value in priceCategories)
            {
                if (this.priceCategories.Contains(value))
                {
                    priceCategoriesFound++;
                }
            }

            if (priceCategoriesFound != priceCategories.Count)
            {
                return(false);
            }

            if (!this.routes.Contains(groupTrip.route) || !this.ships.Contains(groupTrip.ship) ||
                !this.tripTypes.Contains(groupTrip.tripType))
            {
                return(false);
            }

            foreach (KeyValuePair <int, Order> entry in this.orders)
            {
                GroupTripOrder order = entry.Value as GroupTripOrder;

                if (order != null && groupTrip.ship == order.groupTrip.ship)
                {
                    /*
                     * Check, whether the time span of the new group trip overlaps with the available group trips
                     * if it's the same ship
                     */
                    if (DateTime.Compare(groupTrip.depatureTime, DateTime.Today) < 0 &&
                        DateTime.Compare(groupTrip.depatureTime, order.groupTrip.depatureTime) >= 0 &&
                        DateTime.Compare(groupTrip.depatureTime, order.groupTrip.returnTime) <= 0 ||
                        DateTime.Compare(groupTrip.returnTime, order.groupTrip.depatureTime) >= 0 &&
                        DateTime.Compare(groupTrip.returnTime, order.groupTrip.returnTime) <= 0)
                    {
                        return(false);
                    }
                }
            }
            return(true);
        }
 public GroupTripOrder(PaymentType paymentType, DateTime orderDate, User user, Address orderAddress, int orderNumber, GroupTrip groupTrip)
     : base(paymentType, orderDate, user, orderAddress, groupTrip.getTotalPrice(), orderNumber)
 {
     this.groupTrip = groupTrip ?? throw new ArgumentNullException(nameof(groupTrip));
 }