public static JmOptionRequest CreateOptionRequest(this JmPriceRequest request)
 {
     return(new JmOptionRequest
     {
         OperationType = request.OperationType,
         UnitType = request.UnitType
     });
 }
예제 #2
0
        public async Task <JmOptionResponse> GetOptionResponse(JmPriceRequest priceRequest)
        {
            _validator.Validate(priceRequest);

            var options = await _optionsRepository.GetAsync(priceRequest.CreateOptionRequest());

            return(new JmOptionResponse(options.Select(o => o.CreateDomain())));
        }
        public async Task <JmPrice> GetAsync(JmPriceRequest request)
        {
            var price = await _dataStorage.GetData(x =>
                                                   x.Height >= request.Height &&
                                                   x.Height < (request.Height + 100) &&
                                                   x.UnitType == request.UnitType);

            return(price);
        }
예제 #4
0
        public async Task <ActionResult> GetOptions([FromBody] JmPriceRequest priceRequest)
        {
            try
            {
                var options = await _priceProcessor.GetOptionResponse(priceRequest);

                return(Ok(options));
            }
            catch (Exception x)
            {
                return(BadRequest(x.Message));
            }
        }
예제 #5
0
        public async Task <ActionResult> GetPrice([FromBody] JmPriceRequest priceRequest)
        {
            try
            {
                var price = await _priceProcessor.CalculatePrice(priceRequest);

                return(Ok(price));
            }
            catch (Exception x)
            {
                return(BadRequest(x.Message));
            }
        }
예제 #6
0
        public void Validate(JmPriceRequest request)
        {
            var context = new ValidationContext(request);
            var results = new List <ValidationResult>();

            if (!Validator.TryValidateObject(request, context, results, true))
            {
                StringBuilder sb = new StringBuilder();

                foreach (var result in results)
                {
                    sb.Append($"{result.ErrorMessage}; ");
                }

                throw new ValidationException(sb.ToString());
            }
        }
예제 #7
0
        public async Task <JmPriceResponse> CalculatePrice(JmPriceRequest priceRequest)
        {
            _validator.Validate(priceRequest);

            var price = await _priceRepository.GetAsync(priceRequest);

            if (price == null)
            {
                throw new NullReferenceException(nameof(price));
            }

            if (price.Values.Length == 0)
            {
                throw new ArgumentOutOfRangeException(nameof(price.Values), "Cann't find price for specified height");
            }

            var priceResponse = new JmPriceResponse()
            {
                PricePerUnit = price.Values[(priceRequest.Width - 500) / 100]
            };

            return(await CalculateOptions(priceResponse, priceRequest));
        }
예제 #8
0
        private async Task <JmPriceResponse> CalculateOptions(JmPriceResponse priceResponse, JmPriceRequest priceRequest)
        {
            var options = await _optionsRepository.GetAsync(priceRequest.CreateOptionRequest());

            if (options == null)
            {
                throw new NullReferenceException(nameof(options));
            }

            foreach (var option in options.Where(op =>
                                                 op == priceRequest.GuidingRailBracket ||
                                                 op == priceRequest.HeadRailBraket ||
                                                 op == priceRequest.OperationControl ||
                                                 op == priceRequest.LeftGuidingRail ||
                                                 op == priceRequest.RightGuidingRail))
            {
                var optionQuantity = 1;

                if (option.Type == typeof(JmHeadrailBracketTypes).FullName)
                {
                    var quantity = (priceRequest.Width - 400) / 800;
                    optionQuantity = quantity < 2 ? 2 : quantity;
                }
                else if (option.Type == typeof(JmWireBracketTypes).FullName)
                {
                    optionQuantity = 2;
                }
                else if (option.Type == typeof(JmGuidingRailTypes).FullName)
                {
                    var quantity = (priceRequest.Height - 400) / 800;
                    optionQuantity = quantity < 1 ? 2 : quantity * 2;
                }

                priceResponse.PricePerUnit += option.Price * optionQuantity;
            }

            priceResponse.TotalPrice = priceRequest.Quantity * priceResponse.PricePerUnit;

            return(priceResponse);
        }