예제 #1
0
        public async Task <Result <ReturnCalculationResponse> > CalculateDefaultProposition(ReturnCalculationRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }
            if (request.SiNumber <= 0 || request.SiNumber >= 99999999999)
            {
                throw new ArgumentException("SiNumber is not within a valid range");
            }

            var result = _validation.Validate(request);

            if (result.Code != ResultCode.Ok)
            {
                return(new Result <ReturnCalculationResponse>()
                {
                    Code = result.Code, Messages = result.Messages
                });
            }


            ReturnCalculationResponse response = new ReturnCalculationResponse();

            if (request.ReturnLines == null || request.ReturnLines.Count() == 0)
            {
                return(new Result <ReturnCalculationResponse>(response));
            }

            response.AmountNonRefundable   = _paymentLineService.GetUnreturnableAmount(request.IsFraude, request.ReturnLines);
            response.AmountRefundableByFOD = _paymentLineService.GetReturnableAmountByFOD(request.IsFraude, request.ReturnLines);
            decimal amountToRecover = _paymentLineService.GetReturnableAmount(request.IsFraude, request.ReturnLines);

            var distributeResponse = await this.DistributeAmount(amountToRecover, request.SiNumber, request.Insz);

            response.ReturnLines           = distributeResponse.lines;
            response.AmountRefundableByOGM = distributeResponse.amount;

            return(new Result <ReturnCalculationResponse>(response));
        }
예제 #2
0
        public async Task <Result <bool> > StoreReturnCalculationAsync(ReturnCalculationRequest request)
        {
            var validationResult = _validationService.Validate(request);

            if (validationResult.Code != ResultCode.Ok)
            {
                return(validationResult);
            }

            var serviceRequest = Mapper.Map <SaveReturnCalculationRequest>(request);

            decimal amount = request.ReturnByDeduction;

            if (amount > 0)
            {
                var result = await _propositionService.DistributeAmount(amount, request.SiNumber, request.Insz);

                var lines = result.lines;
                amount = result.amount;

                if (amount > 0)
                {
                    return new Result <bool>(false)
                           {
                               Code = ResultCode.Error
                           }
                }
                ;
                foreach (var item in lines)
                {
                    switch (item.Kind)
                    {
                    case VSBaseAngular.Models.ReturnCalculationKind.ZVZ:
                        serviceRequest.ReturnByZVZ = item.Amount;
                        break;

                    case VSBaseAngular.Models.ReturnCalculationKind.BOB:
                        serviceRequest.ReturnByBOB = item.Amount;
                        break;

                    case VSBaseAngular.Models.ReturnCalculationKind.THAB:
                        serviceRequest.ReturnByTHAB = item.Amount;
                        break;

                    default:
                        break;
                    }
                }
            }


            var returnMessage = await _vsbService.UpsertReturnCalculationAsync(serviceRequest);

            if (returnMessage.Value != null)
            {
                return(new Result <bool>(returnMessage.Value.Succeeded));
            }
            else
            {
                return(new Result <bool>(false)
                {
                    Code = ResultCode.Error, Messages = returnMessage.BusinessMessages.Select(m => m.MessageString).ToList()
                });
            }
        }
    }