/// <summary>
        /// Get details of Hospitality Product groups and its Fixtures
        /// </summary>
        /// <param name="inputModel">The given hospitality product group list input model</param>
        /// <returns>Hospitality Product groups and its fixtures list</returns>
        public HospitalityProductGroupViewModel GetHospitalityProductGroups(HospitalityProductGroupInputModel inputModel)
        {
            HospitalityProductGroupViewModel viewModel            = new HospitalityProductGroupViewModel(getContentAndAttributes: true);
            DataSet                    dsProductGroupList         = new DataSet();
            DataSet                    dsProductGroupFixturesList = new DataSet();
            ErrorObj                   err      = new ErrorObj();
            DEProductDetails           de       = new DEProductDetails();
            DESettings                 settings = Environment.Settings.DESettings;
            List <ProductGroupDetails> productGroupDetailsList  = new List <ProductGroupDetails>();
            List <ProductDetails>      productGroupFixturesList = new List <ProductDetails>();

            dsProductGroupList = retrieveProductGroups();
            viewModel.Error    = Data.PopulateErrorObject(err, dsProductGroupList, settings, GlobalConstants.STATUS_RESULTS_TABLE_NAME, 2);

            if (!viewModel.Error.HasError)
            {
                productGroupDetailsList = Data.PopulateObjectListFromTable <ProductGroupDetails>(dsProductGroupList.Tables["ProductGroupsDetails"]);
                foreach (ProductGroupDetails productGroup in productGroupDetailsList)
                {
                    HospitalityProductGroupInputModel inputModelProductGroup = new HospitalityProductGroupInputModel();
                    inputModelProductGroup.ProductGroupCode = productGroup.GroupId;
                    dsProductGroupFixturesList = retrieveProductGroupFixtures(inputModelProductGroup.ProductGroupCode);
                    viewModel.Error            = Data.PopulateErrorObject(err, dsProductGroupFixturesList, settings, GlobalConstants.STATUS_RESULTS_TABLE_NAME, 2);

                    if (!viewModel.Error.HasError)
                    {
                        productGroup.ProductGroupFixturesList = new List <ProductDetails>();
                        productGroup.ProductGroupFixturesList = Data.PopulateObjectListFromTable <ProductDetails>(dsProductGroupFixturesList.Tables["ProductGroupFixturesDeatils"]);
                    }
                }
                viewModel.ProductGroupDetailsList = productGroupDetailsList;
            }
            return(viewModel);
        }
        /// <summary>
        /// Call the functions of creating the HospitalityProductListViewModel and HospitalityProductGroupViewModel
        /// then use the HospitalityProductGroupViewModel to filter HospitalityProductListViewModel based on ProductCode
        /// </summary>
        /// <param name="inputModelProductList">The given hospitality product list input model</param>
        /// <param name="inputModelProductGroup">The given hospitality product group input model</param>
        /// <returns>The formed hospitality product group view model</returns>
        public HospitalityProductGroupViewModel GetHospitalityProductListByProductGroup(HospitalityProductListInputModel inputModelProductList, HospitalityProductGroupInputModel inputModelProductGroup)
        {
            HospitalityProductListViewModel  productListViewModel  = new HospitalityProductListViewModel(getContentAndAttributes: true);
            HospitalityProductGroupViewModel productGroupViewModel = new HospitalityProductGroupViewModel(getContentAndAttributes: true);

            productListViewModel = GetHospitalityProductList(inputModelProductList);
            if (productListViewModel.Error != null && productListViewModel.Error.HasError)
            {
                productGroupViewModel.Error.HasError = true;
            }
            else
            {
                productGroupViewModel = GetHospitalityProductGroups(inputModelProductGroup);
                if (productGroupViewModel.Error == null || !productGroupViewModel.Error.HasError)
                {
                    productGroupViewModel.ProductGroupDetailsList = productGroupViewModel.ProductGroupDetailsList.Where(a => a.GroupId.Equals(inputModelProductGroup.ProductGroupCode)).ToList();

                    if (productGroupViewModel.ProductGroupDetailsList.Count > 0)
                    {
                        productGroupViewModel.ProductGroupFixturesList = new List <ProductDetails>();
                        productGroupViewModel.ProductGroupFixturesList = productListViewModel.ProductListDetailByPackageId.Where(a => productGroupViewModel.ProductGroupDetailsList[0].ProductGroupFixturesList.Any(b => b.ProductCode.Trim().Equals(a.ProductCode.Trim()))).ToList();
                    }
                    else
                    {
                        productGroupViewModel.Error.HasError = true;
                    }
                }
            }

            return(productGroupViewModel);
        }
        /// <summary>
        /// Retrieve the list of corporate hospitality packages
        /// </summary>
        /// <param name="inputModel">The given hospitality package list input model</param>
        /// <returns>The formed hospitality package list view model</returns>
        public HospitalityPackageListViewModel GetHospitalityPackageList(HospitalityPackageListInputModel inputModel)
        {
            _packageListViewModel = new HospitalityPackageListViewModel(true);
            _packageListViewModel.FormattedPackagePrice = _packageListViewModel.GetPageText("packagePriceFormat");
            _packageListViewModel.FormattedPackageGroupSizeDescription = _packageListViewModel.GetPageText("packageGroupSizeFormat");

            if (string.IsNullOrEmpty(inputModel.ProductCode) && string.IsNullOrEmpty(inputModel.ProductGroupCode))
            {
                //No product code or product group code is passed in
                DataTable             dtProductListHome   = buildProductListDataTable(GlobalConstants.HOMEPRODUCTTYPE);
                DataTable             dtProductListSeason = buildProductListDataTable(GlobalConstants.SEASONTICKETPRODUCTTYPE);
                List <PackageDetails> packageListHome     = buildPackageList(dtProductListHome);
                List <PackageDetails> packageListSeason   = buildPackageList(dtProductListSeason);
                _packageListViewModel.PackageListDetailsHome   = packageListHome;
                _packageListViewModel.PackageListDetailsSeason = packageListSeason;

                //Calculate Min and Max values for filters on other pages
                if (packageListHome.Count > 0)
                {
                    _packageListViewModel.MinGroupSizeHome = packageListHome.OrderBy((x) => x.GroupSize).Select((x) => x.GroupSize).First();
                    _packageListViewModel.MaxGroupSizeHome = packageListHome.OrderBy((x) => x.GroupSize).Select((x) => x.GroupSize).Last();
                    _packageListViewModel.MinBudgetHome    = packageListHome.OrderBy((x) => x.Price).Select((x) => x.Price).First();
                    _packageListViewModel.MaxBudgetHome    = packageListHome.OrderBy((x) => x.Price).Select((x) => x.Price).Last();
                    foreach (PackageDetails package in _packageListViewModel.PackageListDetailsHome)
                    {
                        string price = TDataObjects.PaymentSettings.FormatCurrency(package.Price, Environment.Settings.BusinessUnit, Environment.Settings.Partner);
                        package.DisplayPrice       = _packageListViewModel.FormattedPackagePrice.Replace("<<PackagePrice>>", price);
                        package.HasSoldOutProducts = false;
                    }
                }
                if (packageListSeason.Count > 0)
                {
                    _packageListViewModel.MinGroupSizeSeason = packageListSeason.OrderBy((x) => x.GroupSize).Select((x) => x.GroupSize).First();
                    _packageListViewModel.MaxGroupSizeSeason = packageListSeason.OrderBy((x) => x.GroupSize).Select((x) => x.GroupSize).Last();
                    _packageListViewModel.MinBudgetSeason    = packageListSeason.OrderBy((x) => x.Price).Select((x) => x.Price).First();
                    _packageListViewModel.MaxBudgetSeason    = packageListSeason.OrderBy((x) => x.Price).Select((x) => x.Price).Last();
                    foreach (PackageDetails package in _packageListViewModel.PackageListDetailsSeason)
                    {
                        string price = TDataObjects.PaymentSettings.FormatCurrency(package.Price, Environment.Settings.BusinessUnit, Environment.Settings.Partner);
                        package.DisplayPrice       = _packageListViewModel.FormattedPackagePrice.Replace("<<PackagePrice>>", price);
                        package.HasSoldOutProducts = false;
                    }
                }
            }
            else if (!string.IsNullOrEmpty(inputModel.ProductCode))
            {
                //A product code has been passed into the viewmodel
                List <PackageDetails> packageListProduct = new List <PackageDetails>();
                DataTable             dtProduct          = new DataTable();
                dtProduct.Columns.Add("ProductCode", typeof(string));
                dtProduct.Rows.Add(inputModel.ProductCode);
                packageListProduct = buildPackageList(dtProduct);
                //If the user has selected a package then it should be removed from the list before bound to the view model
                //This is used to show the related packages for the current fixture that relate to the current package being selected
                packageListProduct = packageListProduct.Where(x => x.PackageID != inputModel.PackageId).ToList();
                _packageListViewModel.PackageListDetailsByProductCode = packageListProduct;
                if (packageListProduct.Count > 0)
                {
                    foreach (PackageDetails package in _packageListViewModel.PackageListDetailsByProductCode)
                    {
                        string price = TDataObjects.PaymentSettings.FormatCurrency(package.Price, Environment.Settings.BusinessUnit, Environment.Settings.Partner);
                        package.DisplayPrice       = _packageListViewModel.FormattedPackagePrice.Replace("<<PackagePrice>>", price);
                        package.HasSoldOutProducts = false;
                    }
                }
            }
            else if (!string.IsNullOrEmpty(inputModel.ProductGroupCode))
            {
                //A product group code has been passed into the viewmodel
                HospitalityProductGroupViewModel viewModel        = new HospitalityProductGroupViewModel(getContentAndAttributes: true);
                DataSet                 dsProductGroupPackageList = new DataSet();
                DataSet                 dsProductGroupFixtures;
                DataSet                 dsSoldOutFixturesList = new DataSet();
                ErrorObj                err      = new ErrorObj();
                DEProductDetails        de       = new DEProductDetails();
                DESettings              settings = Environment.Settings.DESettings;
                List <PackageDetails>   packageListProductGroup  = new List <PackageDetails>();
                List <ProductDetails>   productGroupFixturesList = new List <ProductDetails>();
                List <ComponentDetails> componentsList           = new List <ComponentDetails>();
                List <ComponentDetails> filteredComponentsList;
                List <ComponentDetails> filteredComponentsListPackage;

                dsProductGroupPackageList = retrivePackagesByProductGroup(inputModel.ProductGroupCode);
                viewModel.Error           = Data.PopulateErrorObject(err, dsProductGroupPackageList, settings, GlobalConstants.STATUS_RESULTS_TABLE_NAME, 4);
                if (!viewModel.Error.HasError)
                {
                    packageListProductGroup = Data.PopulateObjectListFromTable <PackageDetails>(dsProductGroupPackageList.Tables["PackageList"]);
                    componentsList          = Data.PopulateObjectListFromTable <ComponentDetails>(dsProductGroupPackageList.Tables["ComponentList"]);

                    //retrieve fixtures for product group
                    dsProductGroupFixtures = new DataSet();
                    dsProductGroupFixtures = retrieveProductGroupFixtures(inputModel.ProductGroupCode);
                    viewModel.Error        = Data.PopulateErrorObject(err, dsProductGroupFixtures, settings, GlobalConstants.STATUS_RESULTS_TABLE_NAME, 2);

                    if (!viewModel.Error.HasError)
                    {
                        productGroupFixturesList = Data.PopulateObjectListFromTable <ProductDetails>(dsProductGroupFixtures.Tables["ProductGroupFixturesDeatils"]).Where(s => (Convert.ToDateTime(s.ProductDate)) > DateTime.Now).ToList();
                        foreach (PackageDetails package in packageListProductGroup)
                        {
                            package.SoldOutProducts  = string.Empty;
                            package.ProductGroupCode = inputModel.ProductGroupCode;
                            //get package group size
                            filteredComponentsListPackage = new List <ComponentDetails>();
                            filteredComponentsListPackage = componentsList.Where(x => (x.PackageID == package.PackageID && x.ProductCode == productGroupFixturesList.Select(s => s.ProductCode).Distinct().FirstOrDefault().Trim() && x.ComponentType == "A")).ToList();

                            if (filteredComponentsListPackage.Count > 0)
                            {
                                package.AvailabilityComponentID = filteredComponentsListPackage[0].ComponentID;
                                package.GroupSize = Int32.Parse(filteredComponentsListPackage.Select(x => x.NumberOfUnits).FirstOrDefault().ToString());
                            }
                            else
                            {
                                package.GroupSize = 1;
                            }
                            if (package.GroupSize == 1)
                            {
                                package.GroupSizeDescription = _packageListViewModel.GetPageText("packageGroupSizePerPersonText");
                            }
                            else
                            {
                                package.GroupSizeDescription = _packageListViewModel.FormattedPackageGroupSizeDescription.Replace("<<GroupSize>>", Convert.ToString(package.GroupSize));
                            }

                            //get sold out products
                            foreach (ProductDetails product in productGroupFixturesList)
                            {
                                filteredComponentsList     = new List <ComponentDetails>();
                                filteredComponentsList     = componentsList.Where(x => (x.PackageID == package.PackageID && x.ProductCode == product.ProductCode)).ToList();
                                product.AvailabilityDetail = getAvailabilityDetails(package, filteredComponentsList);

                                if (product.AvailabilityDetail.AvailabilityText.Replace("-", "").Replace(" ", "").ToUpper() == GlobalConstants.HOSPITALITY_FIXTURE_NOT_AVAILABLE)
                                {
                                    if (string.IsNullOrEmpty(package.SoldOutProducts))
                                    {
                                        package.SoldOutProducts = product.ProductCode.Trim();
                                    }
                                    else
                                    {
                                        package.SoldOutProducts = package.SoldOutProducts + ", " + product.ProductCode;
                                    }
                                }
                            }

                            if (package.SoldOutProducts.Length > 0)
                            {
                                package.HasSoldOutProducts = true;
                            }
                            else
                            {
                                package.HasSoldOutProducts = false;
                            }
                        }
                    }
                }

                _packageListViewModel.PackageListDetailsByProductGroup = packageListProductGroup;
            }
            return(_packageListViewModel);
        }