/// <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 products
        /// Home and Season products are sorted and returned as two lists
        /// The date is formatted in a very specific way to allow javascript date formatting to work correctly with time zones.
        /// </summary>
        /// <param name="inputModel">The given hospitality product list input model</param>
        /// <returns>The formed hospitality product list view model</returns>
        public HospitalityProductListViewModel GetHospitalityProductList(HospitalityProductListInputModel inputModel)
        {
            _productListViewModel = new HospitalityProductListViewModel();
            if (String.IsNullOrEmpty(inputModel.PackageID))
            {
                DataTable             dtProductListHome   = buildProductListDataTable(GlobalConstants.HOMEPRODUCTTYPE);
                DataTable             dtProductListSeason = buildProductListDataTable(GlobalConstants.SEASONTICKETPRODUCTTYPE);
                List <ProductDetails> productListHome     = new List <ProductDetails>();
                List <ProductDetails> productListSeason   = new List <ProductDetails>();
                productListHome   = Data.PopulateObjectListFromTable <ProductDetails>(dtProductListHome);
                productListSeason = Data.PopulateObjectListFromTable <ProductDetails>(dtProductListSeason);

                foreach (ProductDetails product in productListHome)
                {
                    DateTime dateUpdated = new DateTime();
                    dateUpdated               = Utilities.ISeriesDate(product.ProductMDTE08);
                    product.ProductDate       = dateUpdated.ToString(Environment.Settings.DefaultValues.GlobalDateFormat);
                    product.ProductDateSearch = dateUpdated.ToString("yyyy-MM-ddT00:00:00Z");//specific time format for filtering
                }
                foreach (ProductDetails product in productListSeason)
                {
                    DateTime dateUpdated = new DateTime();
                    dateUpdated               = Utilities.ISeriesDate(product.ProductMDTE08);
                    product.ProductDate       = dateUpdated.ToString(Environment.Settings.DefaultValues.GlobalDateFormat);
                    product.ProductDateSearch = dateUpdated.ToString("yyyy-MM-ddT00:00:00Z");//specific time format for filtering
                }

                _productListViewModel.ProductListDetailsHome   = productListHome;
                _productListViewModel.ProductListDetailsSeason = productListSeason;
                if (productListHome.Count > 0)
                {
                    _productListViewModel.MinDateHome = productListHome.OrderBy((x) => x.ProductMDTE08).Select((x) => x.ProductDateSearch).First();
                    _productListViewModel.MaxDateHome = productListHome.OrderBy((x) => x.ProductMDTE08).Select((x) => x.ProductDateSearch).Last();
                }
                if (productListSeason.Count > 0)
                {
                    _productListViewModel.MinDateSeason = productListSeason.OrderBy((x) => x.ProductMDTE08).Select((x) => x.ProductDateSearch).First();
                    _productListViewModel.MaxDateSeason = productListSeason.OrderBy((x) => x.ProductMDTE08).Select((x) => x.ProductDateSearch).Last();
                }
            }
            else
            {
                // PackageId must have been pass into viewModel
                // Retrieve the product list based on the selected package ID
                List <ProductDetails> productList   = new List <ProductDetails>();
                DataTable             dtProductList = buildProductListDataTable(inputModel.ProductType);
                foreach (DataRow productRow in dtProductList.Rows)
                {
                    DataSet   dsPackagesAndComponents = retrieveHospitalityPackages(productRow["ProductCode"].ToString());
                    DataTable dtPackages   = dsPackagesAndComponents.Tables["PackageList"];
                    DataTable dtComponents = dsPackagesAndComponents.Tables["ComponentList"];
                    DataView  dvFilteredPackages;
                    DataTable dtFilteredPackages;
                    if (dtPackages != null && dtComponents != null)
                    {
                        //check if packageList contains selected package
                        dvFilteredPackages           = new DataView(dtPackages);
                        dvFilteredPackages.RowFilter = String.Format("PackageId = '{0}'", inputModel.PackageID.ToString());
                        dtFilteredPackages           = dvFilteredPackages.ToTable();
                        if (dtFilteredPackages.Rows.Count > 0)
                        {
                            ProductDetails          product                = new ProductDetails();
                            List <PackageDetails>   packageList            = new List <PackageDetails>();
                            List <ComponentDetails> componentsList         = new List <ComponentDetails>();
                            List <ComponentDetails> filteredComponentsList = new List <ComponentDetails>();
                            DateTime dateUpdated = new DateTime();

                            dateUpdated = Utilities.ISeriesDate(productRow["ProductMDTE08"].ToString());
                            productRow["ProductDate"] = dateUpdated.ToString(Environment.Settings.DefaultValues.GlobalDateFormat);
                            product                    = Data.PopulateObjectFromRow <ProductDetails>(productRow);
                            packageList                = Data.PopulateObjectListFromTable <PackageDetails>(dtFilteredPackages);
                            componentsList             = Data.PopulateObjectListFromTable <ComponentDetails>(dtComponents);
                            filteredComponentsList     = componentsList.Where(x => x.PackageID.ToString() == inputModel.PackageID).ToList();
                            product.AvailabilityDetail = getAvailabilityDetails(packageList[0], filteredComponentsList);
                            productList.Add(product);
                        }
                    }
                }
                _productListViewModel.ProductListDetailByPackageId = productList;
            }
            return(_productListViewModel);
        }