public async Task DoReversal_ReversingRescue_ReturningSuccessPartial() { _mockUnitOfWork.Setup(x => x.CommitAsync()).ReturnsAsync(true); _mockOrderStatusRepository.Setup(x => x.GetById(It.IsAny <int>())).ReturnsAsync(new OrderStatus { Id = 6 }); _mockUserRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <User, bool> > >())).ReturnsAsync(new List <User> { new User { Id = 10, Cpf = "12312312312" } }); _mockOrderRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <Order, bool> > >(), It.IsAny <Expression <Func <Order, object> > >(), It.IsAny <Expression <Func <Order, object> > >())).ReturnsAsync(new List <Order> { new Order { Login = "******", Id = 10, ExternalOrderId = 123, User = new User { Id = 10, Cpf = "12312312312" }, Total = 50, OrderStatus = new OrderStatus { Id = 4 } } }); _mockOrderItemRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <OrderItem, bool> > >())).ReturnsAsync(new List <OrderItem> { new OrderItem { CodeItem = 123 } }); _mockOrderReversalItemRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <OrderReversalItem, bool> > >())).ReturnsAsync(new List <OrderReversalItem> { new OrderReversalItem { ExternalOrderId = 123, TotalValue = 10 } }); var service = new OrderService(_mockOrderReversalItemRepository.Object, _mockUserPunctuationRepository.Object, _mockUserPunctuationSourceRepository.Object, _mockUserRepository.Object, _mockLogger.Object, _mockOrderRepository.Object, _mockOrderItemRepository.Object, _mockOrderStatusRepository.Object, _mockUnitOfWork.Object, _mockShopUserRepository.Object, _mapper); var reversalRequest = new ReversalRequestDto { Cpf = "12312312312", ExternalOrderId = 123, ReversalRequestItems = new List <ReversalRequestItemsDto> { new ReversalRequestItemsDto { CodeItem = 123, ExternalOrderId = 123, TotalValue = 40 } } }; var result = await service.DoReversal(reversalRequest); Assert.True(result.Success); Assert.IsType <List <Order> >(result.Data); Assert.Equal((int)OrderStatusEnum.Reversed, result.Data.First().OrderStatus.Id); }
public async Task DoReversal_ReversingRescueWasReversed_ReturningFalse() { _mockUnitOfWork.Setup(x => x.CommitAsync()).ReturnsAsync(true); _mockOrderStatusRepository.Setup(x => x.GetById(It.IsAny <int>())).ReturnsAsync(new OrderStatus { Id = 6 }); _mockUserRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <User, bool> > >())).ReturnsAsync(new List <User> { new User { Id = 10, Cpf = "12312312312" } }); _mockOrderRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <Order, bool> > >(), It.IsAny <Expression <Func <Order, object> > >(), It.IsAny <Expression <Func <Order, object> > >())).ReturnsAsync(new List <Order> { new Order { Login = "******", Id = 10, ExternalOrderId = 123, User = new User { Id = 10, Cpf = "12312312312" }, Total = 50, OrderStatus = new OrderStatus { Id = 4 } } }); _mockOrderItemRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <OrderItem, bool> > >())).ReturnsAsync(new List <OrderItem> { new OrderItem { CodeItem = 123 } }); _mockOrderReversalItemRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <OrderReversalItem, bool> > >())).ReturnsAsync(new List <OrderReversalItem> { new OrderReversalItem { CodeItem = 123 } }); var service = new OrderService(_mockOrderReversalItemRepository.Object, _mockUserPunctuationRepository.Object, _mockUserPunctuationSourceRepository.Object, _mockUserRepository.Object, _mockLogger.Object, _mockOrderRepository.Object, _mockOrderItemRepository.Object, _mockOrderStatusRepository.Object, _mockUnitOfWork.Object, _mockShopUserRepository.Object, _mapper); var reversalRequest = new ReversalRequestDto { Cpf = "12312312312", ExternalOrderId = 123, ReversalRequestItems = new List <ReversalRequestItemsDto> { new ReversalRequestItemsDto { CodeItem = 123, ExternalOrderId = 123, TotalValue = 50 } } }; var result = await service.DoReversal(reversalRequest); Assert.False(result.Success); Assert.Equal("estorno recusado item já estornado", result.Message); }
public async Task <IActionResult> Reversal([FromBody] ReversalRequestDto reversalRequestDto) { try { var result = await _orderService.DoReversal(reversalRequestDto); if (!result.Success) { return(BadRequest(result)); } return(Ok(result)); } catch (Exception ex) { #if (!DEBUG) _logger.Fatal($"Tentativa de gerar estorno do cpf :{reversalRequestDto.Cpf} e pedido extorno {reversalRequestDto.ExternalOrderId} - {ex.ToLogString(Environment.StackTrace)}"); #endif return(BadRequest($"Tentativa de gerar estorno do cpf :{reversalRequestDto.Cpf} e pedido extorno {reversalRequestDto.ExternalOrderId} - {ex.ToLogString(Environment.StackTrace)}")); } }
public async Task <RescueResponseDto <Order> > DoReversal(ReversalRequestDto reversalRequestDto) { var user = await _userRepository.CustomFind(x => x.Cpf.Equals(reversalRequestDto.Cpf) && (x.UserStatus.Id == (int)UserStatusEnum.Active || x.UserStatus.Id == (int)UserStatusEnum.OnlyCatalog)); _logger.Info($"estorno de pedido para login {reversalRequestDto.Cpf} - iniciada"); if (!user.Any()) { _logger.Info($"estorno de pedido para login {reversalRequestDto.Cpf} com codigo externo {reversalRequestDto.ExternalOrderId} - usuario invalido"); return(new RescueResponseDto <Order> { Success = false, Message = "usuario invalido" }); } var order = await _orderRepository.CustomFind(x => x.OrderStatus.Id == (int)OrderStatusEnum.Confirmed && x.ExternalOrderId == reversalRequestDto.ExternalOrderId && x.Login.Equals(reversalRequestDto.Cpf) && x.User.Id == user.First().Id, x => x.User, x => x.OrderStatus); if (!order.Any()) { _logger.Fatal($"estorno de pedido para login {reversalRequestDto.Cpf} com codigo externo {reversalRequestDto.ExternalOrderId} - estorno recusado nenhum pedido encontrado nesse status"); return(new RescueResponseDto <Order> { Success = false, Message = "Pedido não encontrado", }); } var orderItems = await _orderItemRepository.CustomFind(x => x.ExternalOrderId == reversalRequestDto.ExternalOrderId && x.Order.Id == order.First().Id); if (!orderItems.Any() || !orderItems.Where(x => reversalRequestDto.ReversalRequestItems.Select(y => y.CodeItem).ToList().Contains(x.CodeItem)).Any()) { _logger.Fatal($"estorno de pedido para login {reversalRequestDto.Cpf} com codigo externo {reversalRequestDto.ExternalOrderId} - estorno recusado itens não encontrado"); return(new RescueResponseDto <Order> { Success = false, Message = "itens não encontrado", }); } var itemsReversed = await _orderReversalItemRepository.CustomFind(x => x.OrderItem.ExternalOrderId == reversalRequestDto.ExternalOrderId && x.OrderItem.Order.Id == order.First().Id); if (itemsReversed.Where(x => reversalRequestDto.ReversalRequestItems.Select(y => y.CodeItem).ToList().Contains(x.CodeItem)).Any()) { _logger.Fatal($"estorno de pedido para login {reversalRequestDto.Cpf} com codigo externo {reversalRequestDto.ExternalOrderId} - estorno recusado item já estornado"); return(new RescueResponseDto <Order> { Success = false, Message = "estorno recusado item já estornado", }); } if (reversalRequestDto.ReversalRequestItems.Sum(x => x.TotalValue) == order.First().Total || (itemsReversed.Any() && (itemsReversed.Sum(x => x.TotalValue) + reversalRequestDto.ReversalRequestItems.Sum(x => x.TotalValue)) == order.First().Total)) { order.First().OrderStatus = await _orderStatusRepository.GetById((int)OrderStatusEnum.Reversed); order.First().ReversedAt = DateTime.Now; } foreach (var item in reversalRequestDto.ReversalRequestItems) { var orderReversalItem = new OrderReversalItem { Ammout = item.Ammout, CodeItem = item.CodeItem, CreatedAt = DateTime.Now, ExternalOrderId = item.ExternalOrderId, OrderItem = orderItems.Where(x => x.CodeItem == item.CodeItem).First(), Reason = item.Reason, TotalValue = item.TotalValue, UnitValue = item.UnitValue }; _orderReversalItemRepository.Save(orderReversalItem); await _unitOfWork.CommitAsync(); _userPunctuationRepository.Save(new UserPunctuation { CreatedAt = DateTime.Now, Punctuation = item.TotalValue, ReferenceEntityId = orderReversalItem.Id, UserPunctuationSource = await _userPunctuationSourceRepository.GetById(3), User = user.First(), Description = $"Estorno pedido {orderReversalItem.Id} ", CurrentMonth = DateTime.Now.Month, CurrentYear = DateTime.Now.Year, OperationType = 'C' }); } var reversalSaved = await _unitOfWork.CommitAsync(); if (reversalSaved) { order.First().User = null; _logger.Info($"estorno de pedido para login {reversalRequestDto.Cpf} com codigo externo {reversalRequestDto.ExternalOrderId} - concluido com sucesso"); return(new RescueResponseDto <Order> { Success = true, Data = order, Message = "OK" }); } else { _logger.Info($"estorno de pedido para login {reversalRequestDto.Cpf} com codigo externo {reversalRequestDto.ExternalOrderId} - estorno recusado ocorreu um erro ao tenta gerar estorno"); return(new RescueResponseDto <Order> { Success = false, Message = "Ocorreu um erro ao tentar gerar o estorno", }); } }