コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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)}"));
            }
        }
コード例 #4
0
        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",
                });
            }
        }