Ejemplo n.º 1
0
        public ActionResult AddUtilityBuilding()
        {
            var utilityBuilding = new UtilityBuildingModel
            {
                UtilityBuildingTypeId = (int)UtilityBuildingTypes.Hotel,
                Periods = new List<Period>()
            };

            using (var db = new Models.OnLeaveContext())
            {
                utilityBuilding.Facilities = db.UtilityBuildingFacilityTypes
                    .Select(ft => new FacilityTypeModel
                    {
                        FacilityTypeId = ft.UtilityBuildingFacilityTypeId,
                        FacilityTypeName = ft.Name
                    })
                    .ToArray();

                // five periods per hotel
                while (utilityBuilding.Periods.Count < 5)
                {
                    utilityBuilding.Periods.Add(new Period
                    {
                        FromDate = DateTime.Now.Date,
                        ToDate = DateTime.Now.Date,
                        RoomAmounts = StaticDataProvider.RoomTypes.Select(rType => new RoomAmount
                        {
                            Amount = 0M,
                            RoomTypeId = rType.RoomTypeId,                            
                        }).ToList()
                    });
                }
            }

            ViewBag.Cities = StaticDataProvider.Cities.Select(c => new SelectListItem { Text = c.Name, Value = c.CityId.ToString() });
            ViewBag.RoomTypes = StaticDataProvider.RoomTypes;
            ViewBag.UtilityBuildingTypes = StaticDataProvider.UtilityBuildingTypes.Select(t => new SelectListItem
            {
                Text = t.Description,
                Value = t.UtilityBuildingTypeId.ToString()
            });

            return PartialView(utilityBuilding);
        }
Ejemplo n.º 2
0
        public ActionResult EditBuilding(UtilityBuildingModel model)
        {
            
            if (ModelState.IsValid)
            {
                using (var db = new Models.OnLeaveContext())
                {
                    var buildingDB = db.UtilityBuildings
                        .Include(b => b.Periods)
                        .Include(b => b.Offers)
                        .Include(b => b.UtilityBuildingPhotoDetails)
                        .Include(b => b.UtilityBuildingLocales)
                        .FirstOrDefault(b => b.UtilityBuildingId == model.Id);
                    if (buildingDB == null || buildingDB.UserId != User.Identity.GetUserId())
                    {
                        new HttpStatusCodeResult(System.Net.HttpStatusCode.NotFound);
                    }

                    buildingDB.UtilityBuildingTypeId = model.UtilityBuildingTypeId;                    
                    buildingDB.PhoneNumber = model.PhoneNumber;
                    buildingDB.CityId = model.CityId;
                    buildingDB.Rating = model.Rating;
                    buildingDB.Size = model.Size;

                    if (User.IsInRole("Root"))
                    {
                        buildingDB.SearchRating = model.SearchRating;
                    }

                    var buildingLocaleBG = buildingDB.UtilityBuildingLocales.FirstOrDefault(l => l.LocaleId == (int)LocaleTypes.BG);
                    if (buildingLocaleBG != null)
                    {
                        buildingLocaleBG.Name = model.Name;
                        buildingLocaleBG.Description = model.Description;
                        buildingLocaleBG.ContactPerson = model.ContactPerson;
                        buildingLocaleBG.Address = model.Address;
                    }
                    else
                    {
                        buildingDB.UtilityBuildingLocales.Add(new UtilityBuildingLocale
                        {
                            LocaleId = (int)LocaleTypes.BG,
                            Name = model.Name,
                            Description = model.Description,
                            ContactPerson = model.ContactPerson,
                            Address = model.Address
                        });
                    }

                    var buildingLocaleEN = buildingDB.UtilityBuildingLocales.FirstOrDefault(l => l.LocaleId == (int)LocaleTypes.EN);
                    if (buildingLocaleEN != null)
                    {
                         if (string.IsNullOrWhiteSpace(model.ContactPersonEN)
                        && string.IsNullOrWhiteSpace(model.NameEN)
                        && string.IsNullOrWhiteSpace(model.DescriptionEN)
                        && string.IsNullOrWhiteSpace(model.AddressEN))
                         {
                             // remove if no data                             
                             db.UtilityBuildingLocales.Remove(buildingLocaleEN);
                         }
                         else
                         {
                             buildingLocaleEN.Name = model.NameEN;
                             buildingLocaleEN.Description = model.DescriptionEN;
                             buildingLocaleEN.ContactPerson = model.ContactPersonEN;
                             buildingLocaleEN.Address = model.AddressEN;
                         }
                    }
                    else
                    {
                        if (!string.IsNullOrWhiteSpace(model.ContactPersonEN)
                       || !string.IsNullOrWhiteSpace(model.NameEN)
                       || !string.IsNullOrWhiteSpace(model.DescriptionEN)
                       || !string.IsNullOrWhiteSpace(model.Address))
                        {
                            buildingDB.UtilityBuildingLocales.Add(new UtilityBuildingLocale
                            {
                                LocaleId = (int)LocaleTypes.EN,
                                Name = model.NameEN,
                                Description = model.DescriptionEN,
                                ContactPerson = model.ContactPersonEN,
                                Address = model.AddressEN
                            });
                        }
                    }

                     // update facilities info
                    var facilitiesToRemove = buildingDB.UtilityBuidingFacilityDetails
                        .Where(fd => !model.Facilities.Any(f => f.FacilityTypeId == fd.UtilityBuildingFacilityTypeId && f.Selected));                    

                    db.UtilityBuidingFacilityDetails.RemoveRange(facilitiesToRemove);

                    model.Facilities.Where(f => f.Selected).ToList().ForEach(f =>
                    {
                        if (!buildingDB.UtilityBuidingFacilityDetails.Any(fd => fd.UtilityBuildingFacilityTypeId == f.FacilityTypeId))
                        {
                            buildingDB.UtilityBuidingFacilityDetails.Add(new UtilityBuidingFacilityDetail
                            {
                                UtilityBuildingFacilityTypeId = f.FacilityTypeId,
                                UtilityBuildingId = model.Id
                            });
                        }
                    });

                    // periods
                    model.Periods.Where(p => !p.StartDate.HasValue).ToList().ForEach(p => p.StartDate = DateTime.Now.Date);
                    model.Periods.Where(p => !p.EndDate.HasValue).ToList().ForEach(p => p.EndDate = DateTime.Now.Date);

                    var periodsToRemove = buildingDB.Periods
                        .Where(pDB => 
                            !model.Periods.Where(p => p.PeriodId != 0).Any(p => p.PeriodId == pDB.PeriodId && p.RoomAmounts.Any(a => a.Amount != 0M)))
                            .ToList();

                    var periodsToAdd = model.Periods.Where(p => p.PeriodId == 0 && p.RoomAmounts.Any(a => a.Amount != 0M))
                        .Select(p => new Period
                        {
                            FromDate = p.FromDate,
                            ToDate = p.ToDate,
                            RoomAmounts = p.RoomAmounts.Where(a => a.Amount != 0M).Select(a => new RoomAmount{
                                Amount = a.Amount,
                                RoomTypeId = a.RoomTypeId
                            }).ToList()
                        }).ToList();

                    db.RoomAmounts.RemoveRange(periodsToRemove.SelectMany(p => p.RoomAmounts));
                    db.Periods.RemoveRange(periodsToRemove);

                    buildingDB.Periods.ToList().ForEach(pDB =>
                    {
                        var period = model.Periods.First(p => p.PeriodId == pDB.PeriodId);
                        pDB.FromDate = period.FromDate;
                        pDB.ToDate = period.ToDate;

                        var amountsToDelete = pDB.RoomAmounts
                            .Where(aDB => !period.RoomAmounts.Any(a => a.RoomAmountId == aDB.RoomAmountId && a.Amount != 0M))
                            .ToList();

                        db.RoomAmounts.RemoveRange(amountsToDelete);

                        pDB.RoomAmounts
                            .Where(aDB => period.RoomAmounts.Any(a => a.RoomTypeId == aDB.RoomTypeId))
                            .ToList()
                            .ForEach(aDB => { aDB.Amount = period.RoomAmounts.First(a => a.RoomTypeId == aDB.RoomTypeId).Amount; });

                        period.RoomAmounts
                            .Where(a => a.RoomAmountId == 0 && a.Amount != 0M)
                            .ToList()
                            .ForEach(a => pDB.RoomAmounts.Add(new RoomAmount
                            {
                                PeriodId = pDB.PeriodId,
                                RoomTypeId = a.RoomTypeId,
                                Amount = a.Amount
                            }));
                    });

                    periodsToAdd.ForEach(p => buildingDB.Periods.Add(p));
                    
                    // Offers
                    var offersToDelete = buildingDB.Offers
                        .Where(o => model.Offers == null ||  !model.Offers.Any(offer => offer.OfferId == o.OfferId));
                    db.Offers.RemoveRange(offersToDelete);
                    model.Offers.Where(o => o.OfferId > 0).ToList().ForEach(o =>
                    {
                        var offerDB = buildingDB.Offers.FirstOrDefault(oDB => oDB.OfferId == o.OfferId);
                        if (offerDB != null)
                        {
                            offerDB.StartDate = o.StartDate.Value;
                            offerDB.EndDate = o.EndDate;
                            offerDB.Discount = o.Discount;
                            offerDB.Description = o.Description;
                        }
                    });

                    model.Offers.Where(o => o.OfferId == -1).ToList().ForEach(o =>
                    {
                        buildingDB.Offers.Add(new Offer
                        {
                            StartDate = o.StartDate.Value,
                            EndDate = o.EndDate,
                            Discount = o.Discount,
                            Description = o.Description,
                            OfferTypeId = (int)OfferTypes.Discount
                        });
                    });
                    
                    db.SaveChanges();

                    model.Latitude = buildingDB.lat ?? 0M;
                    model.Longitude = buildingDB.lon ?? 0M;
                    model.Periods = buildingDB.Periods.ToList();
                    model.Periods.ForEach(p =>
                    {
                        StaticDataProvider.RoomTypes.ToList().ForEach(rType =>
                        {
                            if (!p.RoomAmounts.Any(a => a.RoomTypeId == rType.RoomTypeId))
                            {
                                p.RoomAmounts.Add(new RoomAmount
                                {
                                    RoomTypeId = rType.RoomTypeId,
                                    Amount = 0M,
                                    PeriodId = p.PeriodId
                                });
                            }
                        });
                    });

                    // 5 periods for each hotel
                    while (model.Periods.Count < 5)
                    {
                        model.Periods.Add(new Period
                        {
                            UtilityBuildingId = model.Id,
                            FromDate = DateTime.Now.Date,
                            ToDate = DateTime.Now.Date,
                            RoomAmounts = StaticDataProvider.RoomTypes.Select(rType => new RoomAmount
                            {
                                RoomTypeId = rType.RoomTypeId,
                                Amount = 0M,
                            }).ToList()
                        });
                    }

                    model.PhotoIds = buildingDB.UtilityBuildingPhotoDetails.Select(p => p.PhotoId).ToList();
                }
            }
            else
            {
                using (var db = new Models.OnLeaveContext())
                {
                    var buildingDB = db.UtilityBuildings
                        .Include(b => b.UtilityBuildingPhotoDetails)
                        .FirstOrDefault(b => b.UtilityBuildingId == model.Id);

                    if (buildingDB != null)
                    {
                        model.Latitude = buildingDB.lat ?? 0M;
                        model.Longitude = buildingDB.lon ?? 0M;
                        model.PhotoIds = buildingDB.UtilityBuildingPhotoDetails.Select(p => p.PhotoId).ToList();
                    }
                }
            }

            var roomTypesIDs = StaticDataProvider.RoomTypes.OrderBy(t => t.RoomTypeId).Select(t => t.RoomTypeId).ToList();
            model.Periods.ForEach(p =>
            {
                // sort room's amount per room's type
                var roomAmouns = p.RoomAmounts.OrderBy(a => a.RoomTypeId, Comparer<int>.Create((a, b) =>
                    {
                        return roomTypesIDs.IndexOf(a).CompareTo(roomTypesIDs.IndexOf(b));
                    })).ToList();
                p.RoomAmounts.Clear();
                roomAmouns.ForEach(a => p.RoomAmounts.Add(a));
            });

            ViewBag.Cities = StaticDataProvider.Cities.Select(c => new SelectListItem { Text = c.Name, Value = c.CityId.ToString() });
            ViewBag.RoomTypes = StaticDataProvider.RoomTypes.OrderBy(t => t.RoomTypeId).ToArray();
            ViewBag.UtilityBuildingTypes = StaticDataProvider.UtilityBuildingTypes.Select(t => new SelectListItem
            {
                Text = t.Description,
                Value = t.UtilityBuildingTypeId.ToString()
            });

            ModelState.Keys.Where(key => key.StartsWith("Periods")).ToList().ForEach(key => ModelState.Remove(key));            
            return PartialView(model);
        }
Ejemplo n.º 3
0
        public ActionResult GetBuilding(int? buildingId)
        {
            if (!buildingId.HasValue)
            {
                return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest);                
            }

            using (var db = new Models.OnLeaveContext())
            {
                var buildingDB = db.UtilityBuildings
                    .Include(b => b.UtilityBuildingPhotoDetails)
                    .Include(b => b.UtilityBuidingFacilityDetails)
                    .Include(b => b.Periods)
                    .Include(b => b.Periods.Select(p => p.RoomAmounts))
                    .Include(b => b.UtilityBuildingLocales)
                    .Include(b => b.Offers)
                    .FirstOrDefault(b => b.UtilityBuildingId == buildingId);
                if (buildingDB == null)
                {
                    return new HttpStatusCodeResult(System.Net.HttpStatusCode.NotFound);
                }

                var bg = buildingDB.UtilityBuildingLocales.FirstOrDefault(l => l.LocaleId == (int)LocaleTypes.BG);
                if (bg == null) bg = new UtilityBuildingLocale();
                var en = buildingDB.UtilityBuildingLocales.FirstOrDefault(l => l.LocaleId == (int)LocaleTypes.EN);
                if (en == null) en = new UtilityBuildingLocale();
                
                var model = new UtilityBuildingModel
                {
                    Id = buildingDB.UtilityBuildingId,
                    Name =  bg.Name,
                    NameEN = en.Name,
                    Description = bg.Description,
                    DescriptionEN = en.Description,
                    UtilityBuildingTypeId = buildingDB.UtilityBuildingTypeId,
                    Address = bg.Address,
                    AddressEN = en.Address,
                    ContactPerson = bg.ContactPerson,
                    ContactPersonEN = en.ContactPerson,
                    PhoneNumber = buildingDB.PhoneNumber,
                    CityId = buildingDB.CityId,
                    Rating = buildingDB.Rating ?? 0,
                    SearchRating = User.IsInRole("Root") ? buildingDB.SearchRating : null,
                    Latitude = buildingDB.lat ?? 0M,
                    Longitude = buildingDB.lon ?? 0M,                    
                    Size = buildingDB.Size,
                    PhotoIds = buildingDB.UtilityBuildingPhotoDetails.Select(ph => ph.PhotoId).ToList(),                    
                    Facilities = db.UtilityBuildingFacilityTypes.Select(ft =>
                        new FacilityTypeModel
                        {
                            FacilityTypeId = ft.UtilityBuildingFacilityTypeId,
                            FacilityTypeName = ft.Name
                        }).ToArray(),
                    Periods = buildingDB.Periods.Select(p => 
                    {
                        StaticDataProvider.RoomTypes.ToList().ForEach(rType =>
                        {
                            var roomAmount = p.RoomAmounts.FirstOrDefault(rAmountDB => rAmountDB.RoomTypeId == rType.RoomTypeId);
                            if (roomAmount == null)
                            {
                                // add default value for room type
                                p.RoomAmounts.Add(new RoomAmount
                                {
                                    PeriodId = p.PeriodId,
                                    RoomTypeId = rType.RoomTypeId,
                                    Amount = 0M,                                    
                                });
                            }
                        });

                        return p; 
                    }).ToList()
                };

                // get offers
                model.Offers = buildingDB.Offers.Select(o => new OnLeave.Models.BusinessEntities.Offer
                {
                    OfferId = o.OfferId,
                    Description = o.Description,
                    StartDate = o.StartDate,
                    EndDate = o.EndDate,
                    Discount = o.Discount
                }).ToList();

                // 5 periods for each hotel
                while (model.Periods.Count < 5)
                {
                    model.Periods.Add(new Period
                    {
                        UtilityBuildingId = model.Id,
                        FromDate = DateTime.Now.Date,
                        ToDate = DateTime.Now.Date,
                        RoomAmounts = StaticDataProvider.RoomTypes.Select(rType => new RoomAmount
                        {
                            RoomTypeId = rType.RoomTypeId,                            
                            Amount = 0M,
                        }).ToList()
                    });
                }

                foreach (var f in model.Facilities)
                {
                    f.Selected = buildingDB.UtilityBuidingFacilityDetails.Any(ft => ft.UtilityBuildingFacilityTypeId == f.FacilityTypeId);
                }

                ViewBag.Cities = StaticDataProvider.Cities.Select(c => new SelectListItem { Text = c.Name, Value = c.CityId.ToString() });
                ViewBag.RoomTypes = StaticDataProvider.RoomTypes;
                ViewBag.UtilityBuildingTypes = StaticDataProvider.UtilityBuildingTypes.Select(t => new SelectListItem
                {
                    Text = t.Description,
                    Value = t.UtilityBuildingTypeId.ToString()
                });

                return PartialView("EditBuilding", model);
            }            
        }
Ejemplo n.º 4
0
        public ActionResult AddUtilityBuilding(UtilityBuildingModel model)
        {
            if (ModelState.IsValid)
            {  
                using (var db = new Models.OnLeaveContext())
                {
                    var city = StaticDataProvider.Cities.FirstOrDefault(c => c.CityId == model.CityId);
                    model.Longitude = city.lon;
                    model.Latitude = city.lat;

                    var building = new UtilityBuilding
                    {
                        KeyWords = model.Name,                        
                        UtilityBuildingTypeId = model.UtilityBuildingTypeId,
                        UserId = User.Identity.GetUserId(),
                        PhoneNumber = model.PhoneNumber,
                        CityId = city.CityId,
                        Rating = model.Rating,
                        lon = model.Longitude,
                        lat = model.Latitude,
                        Size = model.Size
                    };

                    building.UtilityBuildingLocales.Add(new UtilityBuildingLocale
                    {
                        LocaleId = (int)LocaleTypes.BG,
                        Name = model.Name,
                        Description = model.Description,
                        ContactPerson = model.ContactPerson,
                        Address = model.Address
                    });

                    if (!string.IsNullOrWhiteSpace(model.ContactPersonEN)
                        || !string.IsNullOrWhiteSpace(model.NameEN)
                        || !string.IsNullOrWhiteSpace(model.DescriptionEN)
                        || !string.IsNullOrWhiteSpace(model.Address))
                    {
                        building.UtilityBuildingLocales.Add(new UtilityBuildingLocale
                        {
                            LocaleId = (int)LocaleTypes.EN,
                            Name = model.NameEN,
                            Description = model.DescriptionEN,
                            ContactPerson = model.ContactPersonEN,
                            Address = model.AddressEN
                        });
                    }

                    var buildingDB = db.UtilityBuildings.Add(building);                    

                    // update facilities info
                    var facilitiesToRemove = buildingDB.UtilityBuidingFacilityDetails
                        .Where(fd => !model.Facilities.Any(f => f.FacilityTypeId == fd.UtilityBuildingFacilityTypeId && f.Selected));                    

                    db.UtilityBuidingFacilityDetails.RemoveRange(facilitiesToRemove);

                    model.Facilities.Where(f => f.Selected).ToList().ForEach(f =>
                    {
                        if (!buildingDB.UtilityBuidingFacilityDetails.Any(fd => fd.UtilityBuildingFacilityTypeId == f.FacilityTypeId))
                        {
                            buildingDB.UtilityBuidingFacilityDetails.Add(new UtilityBuidingFacilityDetail
                            {
                                UtilityBuildingFacilityTypeId = f.FacilityTypeId,
                            });
                        }
                    });

                    model.Periods.Where(p => p.RoomAmounts.Any(a => a.Amount != 0M)).ToList().ForEach(p =>
                    {
                        buildingDB.Periods.Add(p);
                        p.RoomAmounts.Where(a => a.Amount == 0M)
                            .ToList()
                            .ForEach(a => p.RoomAmounts.Remove(a));                        
                    });

                    db.SaveChanges();

                    model.Id = buildingDB.UtilityBuildingId;                   
                }
                
            }

            ViewBag.Cities = StaticDataProvider.Cities.Select(c => new SelectListItem { Text = c.Name, Value = c.CityId.ToString() });
            ViewBag.RoomTypes = StaticDataProvider.RoomTypes;
            ViewBag.UtilityBuildingTypes = StaticDataProvider.UtilityBuildingTypes.Select(t => new SelectListItem
            {
                Text = t.Description,
                Value = t.UtilityBuildingTypeId.ToString()
            });

            ModelState.Keys.Where(key => key.StartsWith("Periods")).ToList().ForEach(key => ModelState.Remove(key));
            return PartialView(model);
        }
Ejemplo n.º 5
0
        public async Task<ActionResult> AddPicture(UtilityBuildingModel model)
        {
            //ModelState.Clear();
            if (model.Id == 0)
            {
                ModelState.AddModelError(model.GetPropertyName(() => model.PhotoFile), "hotel missing");
            }

            if (model.PhotoFile == null)
            {
                ModelState.AddModelError(model.GetPropertyName(() => model.PhotoFile), "image missing");
            }

            // take just PhotoFile validation
            var errors = ModelState.Where(s => s.Key != model.GetPropertyName(() => model.PhotoFile));
            errors.ToList().ForEach(e => ModelState.Remove(e.Key));

            if (!ModelState.IsValid)
            {
                return PartialView("_BuildingPhotoes", model);
            }

            using (var db = new Models.OnLeaveContext())
            {
                // add pictures
                                
                //var resizedImage = ImageResizer.ImageBuilder.Current.Build(buffer, rSetting);
                //resizedImage.Save(@"C:\\Temp\" + Path.GetFileName(model.PhotoFile.FileName));

                int count = db.UtilityBuildingPhotoDetails.Count(pDetail => pDetail.UtilityBuildingId == model.Id);
                if (count >= 7 - 1)
                {
                    return new HttpStatusCodeResult(System.Net.HttpStatusCode.Forbidden, "maximum number picture exceeded");
                }
                
                using (var ms = new MemoryStream())
                {
                    var job = new ImageResizer.ImageJob(
                        model.PhotoFile,
                        ms,
                        new ImageResizer.Instructions("mode=crop;format=jpg;width=600;height=472;"));
                    
                    await Task.Run(() =>  job.Build());

                    var imageDb = new Photo
                    {
                        KeyWords = null,
                        Name = Path.GetFileName(model.PhotoFile.FileName),
                        Image = ms.ToArray()
                    };                    
                    db.Photos.Add(imageDb);

                    var imageDetail = new UtilityBuildingPhotoDetail
                    {
                        UtilityBuildingId = model.Id,
                        KeyWords = null,
                        PhotoId = imageDb.PhotoId
                    };

                    db.UtilityBuildingPhotoDetails.Add(imageDetail);
                    try
                    {
                        db.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                        System.Console.WriteLine(ex);
                    }

                    // get images
                    model.PhotoIds = db.UtilityBuildingPhotoDetails
                        .Where(pDetail => pDetail.UtilityBuildingId == model.Id)
                        .Select(pDetail => pDetail.PhotoId)
                        .ToList();
                }
            }

            return PartialView("_BuildingPhotoes", model);
        }
Ejemplo n.º 6
0
        public ActionResult GetUtilityBuilding(int buildingId)
        {
            using (var db = new Models.OnLeaveContext())
            {
                var buildingDB = db.UtilityBuildings
                    .Include(b => b.UtilityBuildingPhotoDetails)
                    .Include(b => b.UtilityBuidingFacilityDetails)
                    .Include(b => b.Periods)
                    .Include(b => b.Periods.Select(p => p.RoomAmounts))
                    .Include(b => b.UtilityBuildingLocales)
                    .Include(b => b.Offers)
                    .FirstOrDefault(b => b.UtilityBuildingId == buildingId);
                if (buildingDB == null)
                {
                    return new HttpStatusCodeResult(System.Net.HttpStatusCode.NotFound);
                }

                var model = new UtilityBuildingModel
                {
                    Id = buildingDB.UtilityBuildingId,
                    Name = string.Join(" / ", buildingDB.UtilityBuildingLocales.Select(l => l.Name).ToArray()),
                    Description = string.Join(" <br /><br /> ", buildingDB.UtilityBuildingLocales.Select(l => l.Description).ToArray()),
                    Address = string.Join(" / ", buildingDB.UtilityBuildingLocales.Select(l => l.Address).ToArray()),
                    ContactPerson = string.Join(" / ", buildingDB.UtilityBuildingLocales.Select(l => l.ContactPerson).ToArray()),
                    PhoneNumber = buildingDB.PhoneNumber,
                    PhotoIds = buildingDB.UtilityBuildingPhotoDetails.Select(ph => ph.PhotoId).ToList(),
                    CityId = buildingDB.CityId,
                    Rating = buildingDB.Rating ?? 0,
                    Latitude = buildingDB.lat ?? 0M,
                    Longitude = buildingDB.lon ?? 0M,
                    Size = buildingDB.Size,
                    Periods = buildingDB.Periods.ToList(),
                    Facilities = db.UtilityBuildingFacilityTypes.Select(ft =>
                        new FacilityTypeModel
                        {
                            FacilityTypeId = ft.UtilityBuildingFacilityTypeId,
                            FacilityTypeName = ft.Name
                        }).ToArray(),
                };

                // sort by room types
                model.Periods.ForEach(p =>
                {
                    p.RoomAmounts = p.RoomAmounts
                        .Join(StaticDataProvider.RoomTypes, r => r.RoomTypeId, t => t.RoomTypeId, (r, t) => new
                    {
                        Room = r,
                        Order = t.Order
                    })
                    .OrderBy(r => r.Order)
                    .Select(r => r.Room)
                    .ToList();
                });

                foreach (var f in model.Facilities)
                {
                    f.Selected = buildingDB.UtilityBuidingFacilityDetails.Any(ft => ft.UtilityBuildingFacilityTypeId == f.FacilityTypeId);
                }

                model.Offers = buildingDB.Offers.Select(o => new OnLeave.Models.BusinessEntities.Offer
                {
                    StartDate = o.StartDate,
                    EndDate = o.EndDate,
                    Discount = o.Discount,
                    Description = o.Description
                }).ToList();

                ViewBag.RoomTypes = StaticDataProvider.RoomTypes;
                ViewBag.Cities = StaticDataProvider.Cities;
                //return View(model);
                return PartialView("GetUtilityBuilding", model);
            }
        }