public async Task NotReserveLimitWhenHasLimitAvailable()
        {
            //arrange
            var amountUsed  = 80000;
            var limitType   = LimitType.CashIn;
            var featureType = FeatureType.TED;
            var cycleType   = CycleType.Monthly;
            var levelType   = LevelType.Account;

            var limitLevel = LimitLevel.Create(levelType, amountUsed - 1, 6000);
            var customer   = Fixture.CreateLimitCustomer(limitType, featureType, cycleType, limitLevel);
            var command    = new ReserveLimitCommand()
            {
                CompanyKey     = customer.CompanyKey,
                DocumentNumber = customer.DocumentNumber,
                LimitType      = limitType,
                FeatureType    = featureType,
                CycleType      = cycleType,
                LevelType      = levelType,
                Amount         = amountUsed
            };

            _limitService.GetLimitAsync(Arg.Any <string>(), Arg.Any <string>()).Returns(customer);

            //act
            var result = await _handle.Handle(command, CancellationToken.None);

            //assert
            Assert.False(result.IsValid);
            await _repository.DidNotReceive().SaveAsync(Arg.Any <LimitUsed>());
        }
        public async Task <ResultOfCommandData <LimitAvaliableDto> > Handle(ReserveLimitCommand request, CancellationToken cancellationToken)
        {
            var result        = new ResultOfCommandData <LimitAvaliableDto>();
            var limitCustomer = await _limitService.GetLimitAsync(request.CompanyKey, request.DocumentNumber);

            var limitLevel = limitCustomer.GetLimitLevel(request.LimitType, request.FeatureType, request.CycleType, request.LevelType);

            if (limitLevel.MaxValue >= request.Amount)
            {
                var limitUsed = LimitUsed.Create(request.CompanyKey,
                                                 request.DocumentNumber,
                                                 request.LimitType,
                                                 request.FeatureType,
                                                 request.CycleType,
                                                 request.LevelType,
                                                 request.Amount);

                await _limitUsedCommand.SaveAsync(limitUsed);

                result.Data = new LimitAvaliableDto {
                    AmountUsed = request.Amount, LimitAvaliable = limitLevel.MaxValue - request.Amount
                };
            }
            else
            {
                result.AddErrorMessage(MessageOfDomain.DontHaveLimit);
            }

            return(result);
        }
        public async Task <IActionResult> ReserveLimit([FromBody] ReserveLimitCommand command)
        {
            var result = await _mediator.Send(command);

            return(Ok(result));
        }