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))); }
//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); }
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")); }