/// <summary>
        /// Get Product
        /// </summary>
        /// <param name="productID"></param>
        /// <param name="transaction"></param>
        /// <returns></returns>
        public Product GetProduct(Guid productID, out TransactionalInformation transaction)
        {
            transaction = new TransactionalInformation();

            Product product = new Product();

            try
            {
                productsDataService.CreateSession();
                product = productsDataService.GetProduct(productID);
                transaction.ReturnStatus = true;
            }
            catch (Exception ex)
            {
                transaction.ReturnMessage = new List<string>();
                string errorMessage = ex.Message;
                transaction.ReturnStatus = false;
                transaction.ReturnMessage.Add(errorMessage);
            }
            finally
            {
                productsDataService.CloseSession();
            }

            return product;

        }
        /// <summary>
        /// Create Product
        /// </summary>
        /// <param name="product"></param>
        public void CreateProduct(Product product)
        {
            product.ProductID = Guid.NewGuid();
            DateTime now = DateTime.Now;
            product.DateCreated = now;
            product.DateUpdated = now;

            dbConnection.Products.Add(product);

        }
        /// <summary>
        /// Validate Product Update
        /// </summary>
        /// <param name="product"></param>
        /// <param name="dataService"></param>
        public void ValidateProductUpdate(Product product, IProductsDataService dataService)
        {
            productsDataService = dataService;

            InitializeValidationRules(product);

            ValidateRequired("ProductCode", "Product Code");
            ValidateRequired("Description", "Description");
            ValidateRequired("UnitOfMeasure", "UnitOfMeasure");
            ValidateDecimalIsNotZero("UnitPrice", "Unit Price");
            ValidateDecimalGreaterThanZero("UnitPrice", "Unit Price");

            ValidateUniqueProductCode(product.ProductID, product.ProductCode);


        }
        /// <summary>
        /// Initialize user Business Rules
        /// </summary>
        /// <param name="user"></param>
        /// <param name="dataService"></param>
        public void InitializeProductsBusinessRules(Product product, IProductsDataService dataService)
        {
            productsDataService = dataService;
            InitializeValidationRules(product);

        }
        /// <summary>
        /// Product Inquiry
        /// </summary>
        /// <param name="productCode"></param>
        /// <param name="description"></param>
        /// <param name="paging"></param>
        /// <param name="transaction"></param>
        /// <returns></returns>
        public List<Product> ProductInquiry(string productCode, string description, DataGridPagingInformation paging, out TransactionalInformation transaction)
        {

            transaction = new TransactionalInformation();

            string sortExpression = paging.SortExpression;

            if (paging.SortDirection != string.Empty)
                sortExpression = sortExpression + " " + paging.SortDirection;

            List<Product> productInquiry = new List<Product>();

            int numberOfRows = 0;

            var productQuery = dbConnection.Products.AsQueryable();

            if (productCode != null && productCode.Trim().Length > 0)
            {
                productQuery = productQuery.Where(c => c.ProductCode.StartsWith(productCode));
            }

            if (description != null && description.Trim().Length > 0)
            {
                productQuery = productQuery.Where(c => c.Description.StartsWith(description));
            }

            var products = from p in productQuery
                            select new { p.ProductID, p.ProductCode, p.Description, p.UnitPrice, p.UnitOfMeasure };

            numberOfRows = products.Count();

            products = products.OrderBy(sortExpression);

            var productList = products.Skip((paging.CurrentPageNumber - 1) * paging.PageSize).Take(paging.PageSize);

            paging.TotalRows = numberOfRows;
            paging.TotalPages = AngularJSUtilities.Utilities.CalculateTotalPages(numberOfRows, paging.PageSize);

            foreach (var product in productList)
            {
                Product productData = new Product();
                productData.ProductID = product.ProductID;
                productData.ProductCode = product.ProductCode;
                productData.Description = product.Description;
                productData.UnitOfMeasure = product.UnitOfMeasure;
                productData.UnitPrice = product.UnitPrice;              

                productInquiry.Add(productData);
            }


            transaction.TotalPages = paging.TotalPages;
            transaction.TotalRows = paging.TotalRows;
            transaction.ReturnStatus = true;
            transaction.ReturnMessage.Add(numberOfRows.ToString() + " product records found.");

            return productInquiry;

        }
        /// <summary>
        /// Update Product
        /// </summary>
        /// <param name="product"></param>
        public void UpdateProduct(Product product)
        {           
            DateTime now = DateTime.Now;          
            product.DateUpdated = now;

        }
 public ProductsApiModel()
 {
     Product = new Product();
     Products = new List<Product>();
 }
        /// <summary>
        /// Import Product
        /// </summary>
        /// <param name="columns"></param>
        /// <returns></returns>
        private Boolean ImportProduct(string[] columns)
        {

            Product product = new Product();

            product.ProductCode = GenerateProductCode(columns[0].Trim(), columns[1].Trim());      
            product.Description = columns[1].Trim();
            product.UnitPrice = Convert.ToDecimal(columns[5].Trim());
            product.UnitOfMeasure = columns[4].Trim();
         
            Boolean valid = productsDataService.ValidateDuplicateProduct(product.ProductCode);
            if (valid)
            {
                productsDataService.CreateProduct(product);
            }

            return valid;

        }
        /// <summary>
        /// Update Product
        /// </summary>
        /// <param name="productID"></param>
        /// <param name="productCode"></param>
        /// <param name="description"></param>
        /// <param name="unitPrice"></param>
        /// <param name="unitOfMeasure"></param>
        /// <param name="transaction"></param>
        /// <returns></returns>
        public Product UpdateProduct(Guid productID, string productCode, string description, decimal unitPrice, string unitOfMeasure, out TransactionalInformation transaction)
        {

            transaction = new TransactionalInformation();

            ProductsBusinessRules productsBusinessRules = new ProductsBusinessRules();

            Product product = new Product();

            try
            {

                productsDataService.CreateSession();

                product = productsDataService.GetProduct(productID);
                product.ProductCode = productCode;
                product.Description = description;
                product.UnitPrice = unitPrice;
                product.UnitOfMeasure = unitOfMeasure;            

                productsBusinessRules.ValidateProductUpdate(product, productsDataService);

                if (productsBusinessRules.ValidationStatus == true)
                {
                    productsDataService.BeginTransaction();
                    productsDataService.UpdateProduct(product);
                    productsDataService.CommitTransaction(true);
                    transaction.ReturnStatus = true;
                    transaction.ReturnMessage.Add("Product successfully updated at " + product.DateUpdated.ToString());
                }
                else
                {
                    transaction.ReturnStatus = productsBusinessRules.ValidationStatus;
                    transaction.ReturnMessage = productsBusinessRules.ValidationMessage;
                    transaction.ValidationErrors = productsBusinessRules.ValidationErrors;
                }

            }
            catch (Exception ex)
            {
                transaction.ReturnMessage = new List<string>();
                string errorMessage = ex.Message;
                transaction.ReturnStatus = false;
                transaction.ReturnMessage.Add(errorMessage);
            }
            finally
            {
                productsDataService.CloseSession();
            }

            return product;


        }