Exemple #1
0
        public async Task <IActionResult> Set(int id, [FromBody] ProductStockAddDTO stockChanges)
        {
            string errorMessage;

            try
            {
                var result = await _services.Set(id, stockChanges);

                return(Ok(result));
            }
            catch (Exception ex)
            {
                errorMessage = ex.Message;
            }

            return(Ok(ResponseResult.Failure <List <ProductStockDTO> >(errorMessage)));
        }
Exemple #2
0
        //TaskProductIsSufficient(int productId, int amount)
        public async Task <(int balance, decimal price)> ProductIsSufficient(int productId, ProductStockAddDTO stockChanges)
        {
            // Check product is exist
            if (productId <= 0)
            {
                throw new ArgumentOutOfRangeException("productId", productId, "Product ID must greater than 0");
            }
            //return ResponseResultWithPagination.Failure<List<ProductStockDTO>>("Id must be greater than 0");


            var product = await _dbContext.Product.FindAsync(productId);

            if (product is null)
            {
                throw new InvalidOperationException("Product is not Exist");
            }

            // Get product balance
            var debit = await _dbContext.Stock
                        .Where(_ => _.ProductId == productId)
                        .SumAsync(_ => _.Debit);


            var credit = await _dbContext.Stock
                         .Where(_ => _.ProductId == productId)
                         .SumAsync(_ => _.Credit);

            /*var data = _dbContext.Product.Where(_ => _.Id == productId).Select(_ => new Balance
             * {
             *  Debit = _.Stock.Select(s => s.Debit).Sum(),
             *  Credit = _.Stock.Select(c => c.Credit).Sum()
             * }).FirstOrDefault();
             *
             *
             * //await _dbContext.Stock.SelectMany(_ => new Balance(_.Debit,_c)).SumAsync();
             *
             * var balance = data.Debit - data.Credit;*/

            var balance = debit - credit;

            // Stock can't be less than 0
            if (stockChanges.Credit > 0 && (balance - stockChanges.Credit) < 0)
            {
                throw new ArithmeticException($"{product.Name} Stock can't be less than 0");
            }

            return(balance, product.Price);
        }
Exemple #3
0
        public async Task <ServiceResponse <ProductStockDTO> > Set(int productId, ProductStockAddDTO stockChanges)
        {
            // UserID is requrid
            if (String.IsNullOrEmpty(GetUserId()))
            {
                throw new UnauthorizedAccessException("User must be presented to perform this method");
            }

            // Stock value must be equal or greater than 0
            if (stockChanges.Debit == 0 && stockChanges.Credit == 0)
            {
                throw new ArgumentNullException("Debit, Credit", "Stock value is required.");
            }

            if (stockChanges.Debit < 0 || stockChanges.Credit < 0)
            {
                throw new ArgumentOutOfRangeException("Debit, Credit", "Stock value must be equal or greater than 0.");
            }

            if (stockChanges.Debit > 0 && stockChanges.Credit > 0)
            {
                throw new ArgumentOutOfRangeException("Debit, Credit", "Stock value must be one of debit or credit only.");
            }

            // Check product is exist
            if (productId <= 0)
            {
                throw new ArgumentOutOfRangeException("productId", productId, "Product ID must greater than 0");
            }


            var product = await _dbContext.Product
                          .Where(_ => _.Id == productId)
                          .Include(_ => _.Group)
                          .FirstOrDefaultAsync();

            if (product is null)
            {
                throw new InvalidOperationException("Product is not Exist");
            }

            int     balance;
            decimal price;

            (balance, price) = await ProductIsSufficient(productId, stockChanges);

            // Add stock record
            Stock productStock = new Stock
            {
                ProductId       = productId,
                Debit           = stockChanges.Debit,
                Credit          = stockChanges.Credit,
                StockBefore     = balance,
                Remark          = stockChanges.Remark,
                CreatedByUserId = Guid.Parse(GetUserId()),
                CreatedDate     = Now()
            };
            await _dbContext.Stock.AddAsync(productStock);

            // Update product's stockbalance
            product.StockCount = productStock.StockAfter;
            _dbContext.Product.Update(product);
            await _dbContext.SaveChangesAsync();

            productStock.Product = product;
            // Mapping data
            var dto = _mapper.Map <ProductStockDTO>(productStock);

            dto.CreatedByUserId   = Guid.Parse(GetUserId());
            dto.CreatedByUserName = GetUsername();

            // Return
            return(ResponseResult.Success <ProductStockDTO>(dto, $"Product ({product.Name}) stock are update successfully"));
        }