示例#1
0
        public static Point3d FirstAnchorRight(RoomPackage room)
        {
            var extentVal    = 0.0;
            var placementVal = 0.0;

            var roomAxisY = room.OrientationPlane.YAxis;
            var roomAxisX = room.OrientationPlane.XAxis;

            if (Confirm.VectorProportionIsVertical(roomAxisY))
            {
                extentVal    = roomAxisY.Y > 0 ? room.Dims.YMax : room.Dims.YMin;
                placementVal = roomAxisX.X > 0 ? room.Dims.XMax : room.Dims.XMin;

                room.Rex = placementVal;

                return(new Point3d(placementVal, extentVal, 0));
            }
            else
            {
                extentVal    = roomAxisY.X > 0 ? room.Dims.XMax : room.Dims.XMin;
                placementVal = roomAxisX.Y > 0 ? room.Dims.YMax : room.Dims.YMin;

                room.Rex = placementVal;

                return(new Point3d(extentVal, placementVal, 0));
            }
        }
示例#2
0
 public static void RemainingProgramTargets(ZonePackage zone, RoomPackage room)
 {
     for (int i = 0; i < room.NumProgramsPlaced.Count; i++)
     {
         zone.RemainingProgramTargets[i] = zone.RemainingProgramTargets[i] - room.NumProgramsPlaced[i];
     }
 }
示例#3
0
        public static void MaximumPlacements(RoomPackage room, ZonePackage zone, ProgramManifest pm)
        {
            var maxPlacement = room.FillOrder
                               .Select(x => pm.ProgramPackages[x].Quota == 0 ? 999 : zone.RemainingProgramTargets[x]).ToList();

            room.MaxPlacement = maxPlacement;
        }
示例#4
0
        /// <summary>
        /// Stages program in center of room. Distorts plane alignment, so only useful for debugging.
        /// </summary>
        /// <param name="room"></param>
        /// <param name="program"></param>
        /// <returns></returns>
        public static PlacementPackage CenteredInRoom(RoomPackage room, ProgramPackage program)
        {
            var roomPlane = room.OrientationPlane;

            var newBounds = new Rectangle3d(roomPlane, new Interval(program.Dims.Width / -2, program.Dims.Width / 2), new Interval(program.Dims.Height / -2, program.Dims.Height / 2)).ToNurbsCurve();

            return(new PlacementPackage(program, roomPlane, newBounds));
        }
示例#5
0
        public ActionResult DeleteConfirmed(int id)
        {
            RoomPackage roomPackage = db.RoomPackage.Find(id);

            db.RoomPackage.Remove(roomPackage);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
示例#6
0
        /// <summary>
        /// Stages program with its base plane location and orientation aligned to room's.
        /// </summary>
        /// <param name="room"></param>
        /// <param name="program"></param>
        /// <returns></returns>
        public static PlacementPackage InRoom(RoomPackage room, ProgramPackage program)
        {
            var roomPlane = new Plane(room.OrientationPlane);

            var newBounds = new Rectangle3d(roomPlane, new Interval(0, program.Dims.Width), new Interval(0, program.Dims.Height * -1)).ToNurbsCurve();

            return(new PlacementPackage(program, roomPlane, newBounds));
        }
示例#7
0
        public static PlacementPackage ForFrontRow(RoomPackage room, PlacementPackage program)
        {
            Transform move = Transform.Translation(room.BaseAnchorLeft - room.OrientationPlane.Origin);

            program.Bounds.Transform(move);

            var stagedPlane = new Plane(room.BaseAnchorLeft, new Vector3d(room.OrientationPlane.XAxis), new Vector3d(room.OrientationPlane.YAxis));

            return(new PlacementPackage(program.Program, stagedPlane, program.Bounds));
        }
示例#8
0
 public ActionResult Edit([Bind(Include = "roomPackageID,namePackage,price,roomTypeID,frequency")] RoomPackage roomPackage)
 {
     if (ModelState.IsValid)
     {
         db.Entry(roomPackage).State = EntityState.Modified;
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     ViewBag.roomTypeID = new SelectList(db.RoomType, "roomTypeID", "typeName", roomPackage.roomTypeID);
     return(View(roomPackage));
 }
示例#9
0
        /// <summary>
        /// Population routine for debugging. Places one instance of highest priority item in room.
        /// </summary>
        /// <param name="room"></param>
        /// <param name="zone"></param>
        /// <param name="pm"></param>
        public static void PlaceOne(RoomPackage room, ZonePackage zone, ProgramManifest pm)
        {
            var firstWithTarget = pm.ProgramPackages[zone.ProgramTargets.IndexOf(zone.ProgramTargets.First(x => x > 0))];

            var candidate = Stage.Program.InRoom(room, firstWithTarget);

            if (Collision.PlacementIsValid(room, candidate, pm))
            {
                room.PlacedItems.Add(candidate);
                room.NumProgramsPlaced[firstWithTarget.Priority] = room.NumProgramsPlaced[firstWithTarget.Priority] + 1;
            }
        }
示例#10
0
        /// <summary>
        /// Basic collision detection routine for single item placement.
        /// </summary>
        /// <param name="room">Room currently being populated.</param>
        /// <param name="candidate">PlacementPackaged being checked for fidelity.</param>
        /// <param name="pm"></param>
        /// <returns></returns>
        public static bool PlacementIsValid(RoomPackage room, PlacementPackage candidate, ProgramManifest pm)
        {
            //Verify placed item does not clash with previously placed items.
            foreach (PlacementPackage placedItem in room.PlacedItems)
            {
                if (Confirm.CurvesIntersect(placedItem.Bounds, candidate.Bounds, true))
                {
                    if (Confirm.CurvesIntersect(placedItem.Bounds, candidate.Bounds, false))
                    {
                        return(false);
                    }

                    CurveIntersections ccx = Intersection.CurveCurve(placedItem.Bounds, candidate.Bounds, 0.1, 0.1);

                    if (ccx.Count(x => x.IsOverlap) > 1)
                    {
                        return(false);
                    }
                }

                PointContainment insideCheck = placedItem.Bounds.Contains(candidate.Bounds.GetBoundingBox(Plane.WorldXY).Center);

                if (insideCheck == PointContainment.Inside || insideCheck == PointContainment.Coincident)
                {
                    return(false);
                }
            }

            //Verify item is completely within boundary of room.
            foreach (Curve edgeCurve in room.AllEdgeCurves)
            {
                if (Confirm.CurvesIntersect(candidate.Bounds, edgeCurve, false))
                {
                    return(false);
                }

                /*
                 * if (!Confirm.PointInRegion(room.Region, new CurveBounds(candidate.Bounds).Center))
                 * {
                 *  return false;
                 * }
                 */
            }

            //Verify program area is not larger than total room area.
            if (room.Region.GetArea() < pm.ProgramPackages[candidate.ProgramIndex].OccupationArea)
            {
                return(false);
            }

            return(true);
        }
示例#11
0
        public static void ProgramFillOrder(RoomPackage room, ZonePackage zone, ProgramManifest pm)
        {
            var fillOrder = Enumerable.Range(0, zone.RemainingProgramTargets.Count)
                            .Where(i => zone.RemainingProgramTargets[i] > 0 && pm.ProgramPackages[i].Quota != 0).ToList()
                            .Select(x => pm.ProgramPackages[x])
                            .OrderByDescending(x => x.Dims.Height).ToList()
                            .Select(x => x.Priority).ToList();

            fillOrder.AddRange(pm.ProgramPackages
                               .Where(x => x.Quota == 0).ToList()
                               .Select(x => x.Priority));

            room.FillOrder = fillOrder;
        }
示例#12
0
        public static PlacementPackage ForRightLane(RoomPackage room, PlacementPackage program)
        {
            //Rotate item and move it to starting point.
            program.Bounds.Rotate(Math.PI / -2, Vector3d.ZAxis, room.OrientationPlane.Origin);

            var shiftDir = new Vector3d(room.OrientationPlane.YAxis);

            shiftDir.Reverse();
            shiftDir = shiftDir * (program.Program.Dims.Width / shiftDir.Length);

            Transform shift = Transform.Translation(shiftDir);
            Transform move  = Transform.Translation(room.BaseAnchorRight - room.OrientationPlane.Origin);

            program.Bounds.Transform(shift);
            program.Bounds.Transform(move);

            //Identify new orientation plane's origin.
            var     roomIsVertical = Math.Abs(room.OrientationPlane.YAxis.Y) > Math.Abs(room.OrientationPlane.YAxis.X);
            Point3d origin;

            if (roomIsVertical)
            {
                origin = room.OrientationPlane.YAxis.Y > 0 ? new Point3d(room.BaseAnchorRight.X, room.BaseAnchorRight.Y - program.Program.Dims.Width, 0) : new Point3d(room.BaseAnchorRight.X, room.BaseAnchorRight.Y + program.Program.Dims.Width, 0);
            }
            else
            {
                origin = room.OrientationPlane.YAxis.X > 0 ? new Point3d(room.BaseAnchorRight.X - program.Program.Dims.Width, room.BaseAnchorRight.Y, 0) : new Point3d(room.BaseAnchorRight.X + program.Program.Dims.Width, room.BaseAnchorRight.Y, 0);
            }

            //Generate new base plane.
            var stagedPlane = new Plane(origin, shiftDir, new Vector3d(room.OrientationPlane.XAxis));

            //Confirm item is still in zone. If not, compensate.
            if (Confirm.PointInRegion(room.Region, new CurveBounds(program.Bounds).Center, 0.1))
            {
                return(new PlacementPackage(program.Program, stagedPlane, program.Bounds));
            }

            //Generate mirror plane and reflect bounds.
            var mirrorPlane = new Plane(room.OrientationPlane);

            mirrorPlane.Rotate(Math.PI / 2, mirrorPlane.YAxis);
            mirrorPlane.Origin = room.BaseAnchorRight;

            Transform mirror = Transform.Mirror(mirrorPlane);

            program.Bounds.Transform(mirror);

            return(new PlacementPackage(program.Program, stagedPlane, program.Bounds));
        }
示例#13
0
        // GET: RoomPackages/Details/5
        public ActionResult Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            RoomPackage roomPackage = db.RoomPackage.Find(id);

            if (roomPackage == null)
            {
                return(HttpNotFound());
            }
            return(View(roomPackage));
        }
示例#14
0
        // GET: RoomPackages/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            RoomPackage roomPackage = db.RoomPackage.Find(id);

            if (roomPackage == null)
            {
                return(HttpNotFound());
            }
            ViewBag.roomTypeID = new SelectList(db.RoomType, "roomTypeID", "typeName", roomPackage.roomTypeID);
            return(View(roomPackage));
        }
示例#15
0
        /// <summary>
        /// Selects best population strategy for room based on current conditions.
        /// </summary>
        /// <param name="room"></param>
        /// <param name="zone"></param>
        /// <param name="pm"></param>
        public static void Room(RoomPackage room, ZonePackage zone, ProgramManifest pm)
        {
            //Prepare room for population routine based on current fill progress.
            room.PlacedItems = new List <PlacementPackage>();

            Stage.Room.BaseAnchors(room);
            Stage.Room.ProgramFillOrder(room, zone, pm);
            Stage.Room.MaximumPlacements(room, zone, pm);

            //Select best population strategy based on room geometry and quotas.
            //TODO: Automate selection process and write base suite of strategies.
            Populate.ByMostRows(room, zone, pm);

            //After room is filled, adjust remaining quota for zone.
            Update.Zone.RemainingProgramTargets(zone, room);
        }
示例#16
0
        public static Point3d NextAnchorRows(RoomPackage room, ProgramPackage program, Point3d anchor, double multiplier, double buffer)
        {
            var step = 0.0;

            if (Confirm.VectorProportionIsVertical(room.OrientationPlane.YAxis))
            {
                step = room.OrientationPlane.YAxis.Y > 0 ? program.Dims.Width * -1 : program.Dims.Width;
                step = (step * multiplier) + buffer;

                return(new Point3d(anchor.X, anchor.Y + step, 0));
            }
            else
            {
                step = room.OrientationPlane.YAxis.X > 0 ? program.Dims.Width * -1 : program.Dims.Width;
                step = (step * multiplier) + buffer;

                return(new Point3d(anchor.X + step, anchor.Y, 0));
            }
        }
示例#17
0
        /// <summary>
        /// Generates a base plane for each room with +Y pointing towards circulation.
        /// Necessary to normalize placement of program across highly varied room geometry.
        /// </summary>
        /// <param name="room"></param>
        /// <param name="zone"></param>
        public static void Orientation(RoomPackage room, ZonePackage zone)
        {
            var circEdge  = Select.PrimaryCirculationEdge(zone);
            var basePoint = Utils.GetRegionCenter(room.Region);

            circEdge.ClosestPoint(basePoint, out double t);
            var circEdgePoint = circEdge.PointAt(t);

            var yDirVector = new Vector3d(circEdgePoint - basePoint);

            var yTestVal = Confirm.VectorProportionIsVertical(yDirVector) ? yDirVector.Y : yDirVector.X;

            var yAxis = Confirm.VectorProportionIsVertical(yDirVector) ? new Vector3d(0, yTestVal, 0) : new Vector3d(yTestVal, 0, 0);
            var xAxis = new Vector3d(yAxis);

            xAxis.Rotate(Math.PI / 2, Vector3d.ZAxis);

            var roomOrientationPlane = new Plane(basePoint, xAxis, yAxis);

            room.OrientationPlane = roomOrientationPlane;
        }
示例#18
0
        /// <summary>
        /// Populates room in rows along its Y axis. Packs along the left (-X) edge until passing the room's midpoint, then packs along right edge until full.
        /// </summary>
        /// <param name="room"></param>
        /// <param name="zone"></param>
        /// <param name="pm"></param>
        public static void ByMostRows(RoomPackage room, ZonePackage zone, ProgramManifest pm)
        {
            var lexFull   = false;
            var rexFull   = false;
            var openZones = !lexFull || !rexFull;

            var anchor = Point3d.Unset;

            //Parent population method.
            while (room.MaxPlacement.Select(x => x > 0).Any() && openZones)
            {
                //Iterate through programs as staged.
                // (Chuck) Important: room.MaxPlacement aligns to program indices in room.FillOrder.
                // These DO NOT align to pm.ProgramPackages, and often don't even contain all programs.
                // To get data for the active program from its ProgramPackage, or to use a list that aligns with it, reference with index at room.FillOrder[i].
                for (int i = 0; i < room.MaxPlacement.Count; i++)
                {
                    var activeProgram      = pm.ProgramPackages[room.FillOrder[i]];
                    var activeProgramIndex = room.FillOrder[i];

                    //Begin packing program.
                    while (room.MaxPlacement[i] - room.NumProgramsPlaced[activeProgramIndex] > 0)
                    {
                        PlacementPackage candidate = null;

                        //Start in left half.
                        if (!lexFull)
                        {
                            candidate = Stage.Program.ForLeftLane(room, Stage.Program.InRoom(room, activeProgram));

                            //Move candidate to next position.
                            anchor = room.NextAnchor == Point3d.Unset ? room.BaseAnchorLeft : room.NextAnchor;
                            candidate.Bounds.Transform(Transform.Translation(anchor - room.BaseAnchorLeft));

                            //Verify that placement is valid and stage next anchor point accordingly.
                            if (Collision.PlacementIsValid(room, candidate, pm))
                            {
                                room.PlacedItems.Add(candidate);
                                room.NumProgramsPlaced[activeProgramIndex]++;

                                candidate.Dims = new CurveBounds(candidate.Bounds);

                                candidate.Orientation.Origin.Transform(Transform.Translation(anchor - room.BaseAnchorLeft));

                                var buffer = 0.0;

                                if (candidate.Program.AccessDirections == "1111")
                                {
                                    buffer = 3;
                                }

                                room.PrevAnchor = anchor;
                                room.NextAnchor = Stage.Room.NextAnchorRows(room, activeProgram, anchor, 1, buffer);
                            }
                            //Otherwise shift anchor slightly and retry.
                            else
                            {
                                room.PrevAnchor = anchor;
                                room.NextAnchor = Stage.Room.NextAnchorRows(room, activeProgram, anchor, 1, 0.1);
                            }

                            if (!Confirm.PointInRegion(room.Region, room.NextAnchor))
                            {
                                if (i == room.MaxPlacement.Count - 1)
                                {
                                    room.NextAnchor = Point3d.Unset;
                                    lexFull         = true;
                                    break;
                                }

                                room.NextAnchor = Point3d.Unset;
                                break;
                            }

                            continue;
                        }

                        if (!rexFull)
                        {
                            candidate = Stage.Program.ForRightLane(room, Stage.Program.InRoom(room, activeProgram));

                            //Move candidate to next position.
                            anchor = room.NextAnchor == Point3d.Unset ? room.BaseAnchorRight : room.NextAnchor;
                            candidate.Bounds.Transform(Transform.Translation(anchor - room.BaseAnchorRight));

                            //Verify that placement is valid and stage next anchor point accordingly.
                            if (Collision.PlacementIsValid(room, candidate, pm))
                            {
                                room.PlacedItems.Add(candidate);
                                room.NumProgramsPlaced[activeProgramIndex]++;

                                candidate.Dims = new CurveBounds(candidate.Bounds);

                                candidate.Orientation.Origin.Transform(Transform.Translation(anchor - room.BaseAnchorRight));

                                var buffer = 0.0;

                                if (candidate.Program.AccessDirections == "1111")
                                {
                                    buffer = 3;
                                }

                                room.PrevAnchor = anchor;
                                room.NextAnchor = Stage.Room.NextAnchorRows(room, activeProgram, anchor, 1, buffer);
                            }
                            //Otherwise shift anchor slightly and retry.
                            else
                            {
                                room.PrevAnchor = anchor;
                                room.NextAnchor = Stage.Room.NextAnchorRows(room, activeProgram, anchor, 1, 0.1);
                            }

                            if (!Confirm.PointInRegion(room.Region, room.NextAnchor))
                            {
                                if (i == room.MaxPlacement.Count - 1)
                                {
                                    room.NextAnchor = Point3d.Unset;
                                    rexFull         = true;
                                    break;
                                }

                                room.NextAnchor = Point3d.Unset;
                                break;
                            }

                            continue;
                        }

                        openZones = false;
                        break;
                    }

                    //Room has been populated.
                }
            }
        }
示例#19
0
 public static void OrientForRoom(Curve crv, PlacementPackage item, RoomPackage room)
 {
     crv.Transform(Transform.Rotation(Vector3d.YAxis, room.OrientationPlane.XAxis, item.Dims.Center));
 }
        public List <HotelChannelResult> MapSearchResult(List <Hotel> searchOutputs, SearchData searchData)
        {
            try
            {
                //save result
                //apply salesRules
                List <HotelChannelResult> searchResponse            = new List <HotelChannelResult>();
                CurrencyManager           currencyManager           = new CurrencyManager();
                SalesRulesManager         ServiceChargeManager      = new SalesRulesManager();
                SalesRulesManager         CancellationChargeManager = new SalesRulesManager();
                var BaseCur = ConfigurationSettings.AppSettings["BaseCur"];

                //start sales rules service charge
                ServiceChargeManager.FillSalesRules(searchData.POS, "Hotel", "Service Charge"); //1
                ServiceChargeManager.PrepareSearchCriteriaDic(searchData);                      //2
                ////
                /////cancellation charge
                CancellationChargeManager.FillSalesRules(searchData.POS, "Hotel", "Cancellation Charge");
                CancellationChargeManager.PrepareSearchCriteriaDic(searchData);
                //

                List <string>       hotelIds      = searchOutputs.Select(a => a.code.ToString()).ToList();
                HotelManager        manager       = new HotelManager();
                List <HotelDetails> HotelDataList = manager.GetChannelHotelData(hotelIds, "4");
                //  List<HotelSearchResult> results = new List<HotelSearchResult>();
                double ProviderExcahngeRate = currencyManager.GetCurrencyConversion(searchOutputs[0].currency, BaseCur, searchData.sID);
                /////double ProviderExcahngeRate = currencyManager.GetCurrencyConversion("EUR", BaseCur);
                double ExcahngeRate = currencyManager.GetCurrencyConversion(BaseCur, searchData.Currency, searchData.sID);
                /////  searchResponse.Locations = HotelDataList.GroupBy(x => x.Location).Select(x => x.FirstOrDefault()).Select(a=>a.Location).ToList();

                int duration = Convert.ToInt32((searchData.DateTo - searchData.DateFrom).TotalDays);
                {
                    DateTime CheckInDate = searchData.DateFrom;
                    for (int i = 0; i < searchOutputs.Count; i++)
                    {
                        HotelDetails       hotelData = HotelDataList.Where(a => a.ProviderHotelId == searchOutputs[i].code.ToString()).FirstOrDefault();
                        HotelChannelResult hotel     = new HotelChannelResult();
                        if (hotelData != null)
                        {
                            hotel.providerHotelCode = searchOutputs[i].code.ToString();
                            hotel.providerID        = "4";

                            hotel.providerHotelID = hotelData.ProviderHotelId;
                            hotel.hotelId         = hotelData.ID.ToString();
                            hotel.sellCurrency    = searchData.Currency;
                            //  hotel.costPrice =//Math.Round( (double.Parse(searchOutputs[i].price.net.Value.ToString()) * ProviderExcahngeRate) /duration,3);
                            hotel.costCurrency = searchOutputs[i].currency;
                            hotel.DeepLink     = "http://93.115.27.156:3030/api/WegoHotelSearch?sid=" + searchData.sID + "&hotelId=" + hotelData.HotelId + "&pid=4";
                            CancellationChargeManager.SetResultCriteria(hotelData.HotelName, int.Parse(hotelData.Rating), hotel.costPrice, "4");
                            AppliedSalesRule AppliedCancellationMarkup = CancellationChargeManager.ApplySalesRules("Markup");
                            int roomcount    = 0;
                            int Packagecount = 0;

                            for (int j = 0; j < searchOutputs[i].rooms.Count; j++)
                            {
                                if (Packagecount == 20)
                                {
                                }
                                RoomPackages            roomPackage = new RoomPackages();
                                List <ChannelRoomsRate> roomsRate   = new List <ChannelRoomsRate>();
                                roomPackage.RoomCategory = searchOutputs[i].rooms[j].name;
                                List <RoomPackage> Containers = new List <RoomPackage>();
                                for (int r = 0; r < searchData.SearchRooms.Count; r++)
                                {
                                    ChannelRoomsRate roomRate = new ChannelRoomsRate();

                                    /*  var rooms = searchOutputs[i].rooms[j].rates.GroupBy(c => new
                                     * {
                                     *    c.adults,
                                     *    c.children,
                                     * }).Select(c => c.Where(a=>a.adults== searchData.SearchRooms[r].Adult &&a.children== searchData.SearchRooms[r].Child.Count).ToList());
                                     */
                                    var rooms = searchOutputs[i].rooms[j].rates.Where(a => a.adults == searchData.SearchRooms[r].Adult && a.children == searchData.SearchRooms[r].Child.Count).GroupBy(p => p.rateKey).Select(grp => grp.FirstOrDefault()).ToList();
                                    if (rooms.Count > 0)
                                    {
                                        roomRate.RoomRates.AddRange(rooms);
                                        roomsRate.Add(roomRate);
                                    }
                                    else
                                    {
                                        var roomnames = searchOutputs[i].rooms[j].name.Split(' ');
                                        //    var key = roomnames[roomnames.Length-1];
                                        int indexToRemove = 0;
                                        roomnames = roomnames.Where((source, index) => index != indexToRemove).ToArray();
                                        var key       = string.Join(" ", roomnames);
                                        var roomstype = searchOutputs[i].rooms.Where(a => a.name.Contains(key));
                                        foreach (var item in roomstype)
                                        {
                                            var lstroom        = item.name.Split(' ');
                                            int index1ToRemove = 0;
                                            lstroom = lstroom.Where((source, index) => index != index1ToRemove).ToArray();
                                            var key1 = string.Join(" ", lstroom);
                                            if (key == key1)
                                            {
                                                var RoomsSameType = item.rates.Where(a => a.adults == searchData.SearchRooms[r].Adult && a.children == searchData.SearchRooms[r].Child.Count).GroupBy(p => p.rateKey).Select(grp => grp.FirstOrDefault()).ToList();
                                                if (RoomsSameType.Count > 0)
                                                {
                                                    roomRate.RoomRates.AddRange(RoomsSameType);
                                                    roomsRate.Add(roomRate);
                                                }
                                            }
                                        }
                                    }
                                    if (roomRate.RoomRates.Count == 0)
                                    {
                                        roomsRate = new List <ChannelRoomsRate>();
                                        break;
                                    }
                                }
                                int max = 0;
                                if (roomsRate.Count > 0)
                                {
                                    max = roomsRate.Max(r => r.RoomRates.Count);
                                }

                                for (int ra = 0; ra < max; ra++)
                                {
                                    RoomPackage Container    = new RoomPackage();
                                    double      sellPerNight = 0;
                                    double      sellPerAll   = 0;

                                    List <RoomResult> resultsPackage = new List <RoomResult>();
                                    foreach (var item in roomsRate)
                                    {
                                        int indx = ra;
                                        if (ra >= item.RoomRates.Count)
                                        {
                                            indx = item.RoomRates.Count - 1;
                                        }
                                        RoomResult room = new RoomResult();

                                        room.PackageNO = Packagecount + 1;
                                        if (item.RoomRates[indx].net == null)
                                        {
                                            continue;
                                        }
                                        room.CostPrice = Math.Round(double.Parse(item.RoomRates[indx].net), 3);

                                        ServiceChargeManager.SetResultCriteria(hotelData.HotelName, int.Parse(hotelData.Rating), room.CostPrice
                                                                               * ProviderExcahngeRate, "4");
                                        AppliedSalesRule AppliedMarkup   = ServiceChargeManager.ApplySalesRules("Markup");
                                        AppliedSalesRule AppliedDiscount = ServiceChargeManager.ApplySalesRules("Discount");

                                        //  room.IsRefundable = searchOutputs[i].rooms[j].refundable;
                                        ////******
                                        room.RatePerNight   = ((room.CostPrice * ProviderExcahngeRate / duration) + AppliedMarkup.Value - AppliedDiscount.Value) * ExcahngeRate;
                                        room.RatePerNight   = Math.Round(room.RatePerNight, 3);
                                        sellPerNight       += room.RatePerNight;
                                        room.TotalSellPrice = Math.Round(room.RatePerNight * duration, 3);
                                        sellPerAll         += room.TotalSellPrice;
                                        roomcount          += 1;
                                        room.RoomIndex      = roomcount;
                                        room.RoomReference  = item.RoomRates[indx].rateKey;
                                        /////
                                        room.RoomCode = searchOutputs[i].rooms[j].code;
                                        /////////
                                        room.RoomType = searchOutputs[i].rooms[j].name;
                                        ///////
                                        room.RoomMeal     = item.RoomRates[indx].boardName;
                                        room.Adult        = item.RoomRates[indx].adults;
                                        room.Child        = item.RoomRates[indx].children;
                                        room.IsRefundable = item.RoomRates[indx].rateClass == "NRF" ? false : true;

                                        ///////
                                        room.Paxs = item.RoomRates[indx].adults + item.RoomRates[indx].children;
                                        //***   room.Images = hotelData.Images.Where(a => a.Category.ToLower() == "hotel rooms").Select(a => a.Url).ToList();
                                        room.DiscountId    = AppliedDiscount.ID;
                                        room.MarkupId      = AppliedMarkup.ID;
                                        room.DiscountValue = AppliedDiscount.Value * ExcahngeRate;
                                        room.MarkupValue   = AppliedMarkup.Value * ExcahngeRate;

                                        room.cancellationRules = item.RoomRates[indx].cancellationPolicies == null ? new List <CancellationRule>()
                                        {
                                            new CancellationRule {
                                                Cost = 0, Price = 0, CanellationRuleText = null, FromDate = null, ToDate = null
                                            }
                                        } :
                                        item.RoomRates[indx].cancellationPolicies.Select(a => new CancellationRule
                                        {
                                            Price = Math.Round(((double.Parse(a.amount) * ProviderExcahngeRate) + AppliedCancellationMarkup.Value) * ExcahngeRate, 3),
                                            CanellationRuleText = searchData.Lang.ToLower() == "en" ? Math.Round(((double.Parse(a.amount) * ProviderExcahngeRate) + AppliedCancellationMarkup.Value) * ExcahngeRate, 3) + "" + searchData.Currency + " To " + a.from : a.from + " إلى " + "" + searchData.Currency + Math.Round(((double.Parse(a.amount) * ProviderExcahngeRate) + AppliedCancellationMarkup.Value) * ExcahngeRate, 3),
                                            Cost     = Math.Round(double.Parse(a.amount)),
                                            FromDate = a.from.ToString()
                                        }).ToList();
                                        resultsPackage.Add(room);
                                    }
                                    Container.No               = Packagecount + 1;
                                    Container.PricePerNight    = sellPerNight;
                                    Container.PricePerAllNight = sellPerAll;
                                    Container.roomResults.AddRange(resultsPackage);
                                    Containers.Add(Container);
                                    Packagecount += 1;
                                }
                                roomPackage.roomPackages.AddRange(Containers);
                                hotel.packages.Add(roomPackage);
                            }
                            double MinPerNight = 0;
                            double MinperAll   = 0;
                            var    mindata     = hotel.packages[0].roomPackages.Where(a => a.PricePerAllNight == hotel.packages[0].roomPackages.Min(x => x.PricePerAllNight)).FirstOrDefault();
                            if (mindata != null)
                            {
                                MinperAll   = mindata.PricePerAllNight;
                                MinPerNight = mindata.PricePerNight;
                            }
                            foreach (var item in hotel.packages)
                            {
                                var minPackage = item.roomPackages.Where(a => a.PricePerAllNight == item.roomPackages.Min(x => x.PricePerAllNight)).FirstOrDefault();
                                if (minPackage != null)
                                {
                                    if (minPackage.PricePerAllNight < MinperAll)
                                    {
                                        MinperAll   = minPackage.PricePerAllNight;
                                        MinPerNight = minPackage.PricePerNight;
                                    }
                                }
                            }
                            // var minRoom = hotel.rooms.Where(a => a.RatePerNight == hotel.rooms.Min(x => x.RatePerNight)).FirstOrDefault();
                            if (MinperAll > 0)
                            {
                                hotel.PricePerNight = MinPerNight;
                                //   hotel.costPrice = minRoom.CostPrice;
                                hotel.PricePerAllNight = MinperAll;
                            }
                            searchResponse.Add(hotel);
                        }
                    }
                    //  searchResponse.HotelResult = results;
                    return(searchResponse);
                }
            }
            catch (Exception ex)
            {
                LoggingHelper.WriteToFile("MapSearchResultChannel/Errors/", "MapSearchResult_" + searchData.sID, ex.Message, ex.Message + " Sourse :" + ex.Source + " Stack Trace :" + ex.StackTrace);
                return(new List <HotelChannelResult>());
            }
        }
示例#21
0
 /// <summary>
 /// Container method for legibility in the staging method that references it.
 /// These methods determine the top left, right, and center points of a room based on its orientation.
 /// </summary>
 /// <param name="room"></param>
 public static void BaseAnchors(RoomPackage room)
 {
     room.BaseAnchorLeft   = Stage.Room.FirstAnchorLeft(room);
     room.BaseAnchorCenter = Stage.Room.FirstAnchorCenter(room);
     room.BaseAnchorRight  = Stage.Room.FirstAnchorRight(room);
 }
示例#22
0
 /// <summary>
 /// Populate room by marching along perimeter. Generate interior islands as necessary.
 /// </summary>
 /// <param name="room"></param>
 /// <param name="zone"></param>
 /// <param name="pm"></param>
 public static void ByPerimeter(RoomPackage room, ZonePackage zone, ProgramManifest pm)
 {
     //TODO: Write this routine. Must solve lane generation problems for curvilinear zones first.
 }
        public HotelPackagesDetails GetHotelPackages(string pid, string sid, string hid)
        {
            HotelPackagesDetails hotelPackages = new HotelPackagesDetails();
            SearchDBEntities     searchDB      = new SearchDBEntities();
            hotelsDBEntities     hotelsDB      = new hotelsDBEntities();
            var hotelSearchData = hotelsDB.hotels.FirstOrDefault(a => a.hotelID == hid);

            var           hotelSearchpro  = hotelsDB.hotelsProviders.FirstOrDefault(a => a.hotelID == hotelSearchData.ID.ToString() && a.providerID == pid);
            var           hotelSearchDesc = hotelsDB.HotelsDescriptions.FirstOrDefault(a => a.hotelID == hid);
            var           Imgs            = hotelsDB.HotelsImages.Where(a => a.HotelID == hid).ToList();
            List <string> images          = Imgs.Select(x => x.URL).ToList();

            hotelPackages.providerHotelID = hotelSearchpro.providerHotelID;
            hotelPackages.hotelCode       = hotelSearchData.hotelID;
            hotelPackages.Address         = hotelSearchData.address;
            hotelPackages.Lng             = hotelSearchData.Lng;
            hotelPackages.Lat             = hotelSearchData.Lat;

            hotelPackages.hotelStars = int.Parse(hotelSearchData.rating);//
            hotelPackages.hotelName  = hotelSearchData.hotelName;
            hotelPackages.providerID = hotelSearchpro.providerID;
            hotelPackages.Location   = hotelSearchData.location;

            hotelPackages.hotelDescription         = hotelSearchDesc.Description1;
            hotelPackages.shortcutHotelDescription = hotelSearchDesc.Description2;
            hotelPackages.City        = hotelSearchData.cityName;
            hotelPackages.Country     = hotelSearchData.countryName;
            hotelPackages.hotelImages = images;

            var          packages    = searchDB.HotelPackages.Where(a => a.Session == sid && a.Hotelid == hid && a.Provider.ToString() == pid).ToList();
            var          Rooms       = searchDB.SearchRoomResults.Where(a => a.sID == sid && a.HotelCode == hid && a.ProviderId.ToString() == pid).ToList();
            RoomPackages roomPackage = new RoomPackages();

            foreach (var item in packages)
            {
                //    var availableCate = hotelPackages.packages.FirstOrDefault(a => a.RoomCategory == item.Category);
                if (roomPackage.RoomCategory != item.Category)
                {
                    if (roomPackage.roomPackages.Count != 0)
                    {
                        roomPackage.PackagesNo = roomPackage.roomPackages.Count;
                        hotelPackages.packages.Add(roomPackage);
                    }
                    roomPackage = new RoomPackages();
                    roomPackage.RoomCategory = item.Category;
                }


                RoomPackage roomPack = new RoomPackage();
                roomPack.No = item.PackageNum.Value;
                roomPack.PricePerAllNight = item.PricePerAllNight.Value;
                roomPack.PricePerNight    = item.PricePerNight.Value;

                var specPack = Rooms.Where(x => x.PackageNo == item.PackageNum).ToList();
                foreach (var r in specPack)
                {
                    RoomResult result = new RoomResult();
                    result.CostPrice      = r.costPrice.Value;
                    result.DiscountId     = r.DiscountId.Value;
                    result.PackageNO      = r.PackageNo.Value;
                    result.DiscountValue  = r.DiscountVal.Value;
                    result.Images         = Imgs.Where(x => x.Category.ToLower() == "hotel rooms").Select(a => a.URL).ToList();
                    result.MarkupId       = r.MarkupId.Value;
                    result.MarkupValue    = r.MarkupVal.Value;
                    result.Paxs           = r.PaxSQty.Value;
                    result.RoomCode       = r.roomType;
                    result.RoomIndex      = int.Parse(r.RoomCode);
                    result.RoomMeal       = r.meal;
                    result.RoomReference  = r.RoomReference;
                    result.RoomType       = r.RoomName;
                    result.TotalSellPrice = r.SellPrice.Value;
                    result.Adult          = r.Adults.Value;
                    result.Child          = r.Childern.Value;
                    if (r.IsRefundable.Value != null)
                    {
                        result.IsRefundable = r.IsRefundable.Value;
                    }
                    roomPack.roomResults.Add(result);
                }
                roomPackage.roomPackages.Add(roomPack);
                //hotelPackages.packages.Add(roomPackage);
            }
            if (roomPackage.roomPackages.Count != 0)
            {
                hotelPackages.packages.Add(roomPackage);
            }
            return(hotelPackages);
        }
示例#24
0
 /// <summary>
 /// Extracts indices of programs each lane was "designed for" during Update.Room.LaneConfiguration.
 /// </summary>
 /// <param name="room"></param>
 /// <param name="zone"></param>
 /// <param name="i"></param>
 public static void ProgramHint(RoomPackage room, ZonePackage zone, int i)
 {
     room.ProgramHint = i >= zone.LanePackages.Count ? new List <int>() : zone.LanePackages[i].Programs;
 }