public async Task <IActionResult> UpdateWarehouseTransactionStatus(int warehouseTransactionId, [FromBody] WarehouseTransactionStatus status) { var res = await _service.UpdateWarehouseTransactionStatusAsync(warehouseTransactionId, status); if (res.Success) { return(Ok(res)); } return(BadRequest(res)); }
public async Task <ServiceResponse <GetWarehouseTransactionDto> > UpdateWarehouseTransactionStatusAsync(int warehouseTransactionId, WarehouseTransactionStatus newStatus) { var response = new ServiceResponse <GetWarehouseTransactionDto>(); try { var dbWarehouseTransaction = await _context.WarehouseTransactions .Include(x => x.Items).ThenInclude(x => x.Product).ThenInclude(x => x.Images) .Include(x => x.Items).ThenInclude(x => x.Product).ThenInclude(x => x.Category) .Include(x => x.Manufacturer) .Include(x => x.CreatedBy) .FirstOrDefaultAsync(x => x.Id == warehouseTransactionId); if (dbWarehouseTransaction == null) { throw new WarehouseTransactionNotFoundException(); } if (!dbWarehouseTransaction.CanModify()) { throw new WarehouseTransactionModifiedException(); } dbWarehouseTransaction.Status = newStatus; if (newStatus == WarehouseTransactionStatus.Done) { // Change the quantity of item var dbWarehouseTransactionItems = dbWarehouseTransaction.Items; var itemIds = dbWarehouseTransactionItems.Select(item => item.ProductId).ToList(); var dbWarehouseItems = await _context.WarehouseItems .Where(x => itemIds.Contains(x.ProductId)) .ToListAsync(); foreach (var dbWarehouseItem in dbWarehouseItems) { var found = dbWarehouseTransactionItems.FirstOrDefault(tItem => tItem.ProductId == dbWarehouseItem.ProductId); dbWarehouseItem.Quantity += dbWarehouseTransaction.TransactionType == WarehouseTransactionType.Import ? found.Quantity : -found.Quantity; _context.WarehouseItems.Update(dbWarehouseItem); } } _context.WarehouseTransactions.Update(dbWarehouseTransaction); await _context.SaveChangeWithValidationAsync(); response.Data = _mapper.Map <GetWarehouseTransactionDto>(dbWarehouseTransaction); return(response); } catch (BaseServiceException ex) { response.Success = false; response.Message = ex.ErrorMessage; response.Code = ex.Code; _logger.LogError(ex.Message, ex.StackTrace); return(response); } catch (Exception ex) { response.Success = false; response.Message = ex.Message; response.Code = ErrorCode.WAREHOUSE_TRANSACTION_UNEXPECTED_ERROR; _logger.LogError(ex.Message, ex.StackTrace); return(response); } }