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));
        }
Exemple #2
0
        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);
            }
        }