Ejemplo n.º 1
0
        /// <summary>
        /// Buy product and move buffered coins to saved amount
        /// </summary>
        /// <param name="productNumber">Ordered product id</param>
        /// <returns>Ordered product</returns>
        public Product Buy(int productNumber)
        {
            if (Products.Length >= productNumber)
            {
                var backedProducts = Products;
                var product        = Products[productNumber - 1];
                try
                {
                    _library.UnfillProduct(productNumber);
                }
                catch (Exception ex)
                {
                    Products = backedProducts;
                    throw ex;
                }

                var backedAmount = _moneyHolder.GetAccountedAmount();
                var backedOrder  = _moneyHolder.GetBufferedAmount();
                try
                {
                    // processing money
                    _moneyHolder.AddAccountedAmount(product.Price);
                    _moneyHolder.SubstractBufferedAmount(product.Price);
                    return(product);
                }
                catch (Exception ex)
                {
                    //in case of any problems with money calculation
                    //revert all transactions and revert product status
                    Products = backedProducts;
                    _moneyHolder.SetAccountedAmount(backedAmount);
                    _moneyHolder.SetBuffedAmount(backedOrder);
                    throw ex;
                }
            }
            else
            {
                throw new IndexOutOfRangeException("Product does not exist");
            }
        }