public async Task <IActionResult> Post([FromBody] CalculateRequestDto requestDto)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (requestDto.ShippingToCountryIso == "CA" && String.IsNullOrEmpty(requestDto.CanadianProvinceCode))
            {
                return(BadRequest("You must specify the property CanadianProvinceCode with a valu for Canadian calculations"));
            }

            return(Ok(_calculatorService.Calculate(requestDto)));
        }
        /// <summary>
        /// Calculate
        /// </summary>
        /// <param name="requestDto"></param>
        /// <returns></returns>
        public CalculateResponseDto Calculate(CalculateRequestDto requestDto)
        {
            CalculateResponseDto response;

            _calculator        = GetCalculator(requestDto.ShippingToCountryIso);
            _calculatorSetting = _calculator.CalculatorSetting;

            // DutyRate override
            if (requestDto.DutyRate != null && requestDto.DutyRate > 0)
            {
                _calculatorSetting.DutyRate = requestDto.DutyRate.GetValueOrDefault();
            }

            // TaxRate override
            if (requestDto.TaxRate != null && requestDto.TaxRate > 0)
            {
                _calculatorSetting.TaxRate = requestDto.TaxRate.GetValueOrDefault();
            }

            // intra region? Don't charge duty
            if (_dbContext.Countries.FirstOrDefault(x => x.Iso == requestDto.ShippingFromCountryIso)?.RegionId ==
                _dbContext.Countries.FirstOrDefault(x => x.Iso == requestDto.ShippingToCountryIso)?.RegionId)
            {
                _calculatorSetting.DutyApplicable = false;
            }

            if (_calculator.CalculatorSetting.DutyApplicable)
            {
                _duty = CalculateDuty(_calculatorSetting, requestDto.MerchandiseTotal, requestDto.ShippingTotal,
                                      requestDto.InsuranceTotal.GetValueOrDefault());
            }

            if (_calculatorSetting.FeesApplicable)
            {
                _fees = CalculateFees(_calculatorSetting, requestDto.MerchandiseTotal);
            }

            if (_calculatorSetting.TaxApplicable)
            {
                _tax = CalculateTax(_calculatorSetting, requestDto.MerchandiseTotal, requestDto.ShippingTotal,
                                    requestDto.InsuranceTotal.GetValueOrDefault(), _duty, _fees);
            }



            // For Canada
            if (requestDto.ShippingToCountryIso.ToUpper() == Enumerations.CountryEnum.CA.ToString())
            {
                return(_mapper.Map(_calculatorSetting, new CanadaCalculateResponseDto()
                {
                    Duty = _duty,
                    Tax = CalculateCanadianTax(requestDto.CanadianProvinceCode, requestDto.MerchandiseTotal, _duty,
                                               Enumerations.CanadianTaxTypeEnum.Gst),
                    Pst = CalculateCanadianTax(requestDto.CanadianProvinceCode, requestDto.MerchandiseTotal, _duty,
                                               Enumerations.CanadianTaxTypeEnum.Pst),
                    PstRate = GetCanadianPstRate(requestDto.CanadianProvinceCode)
                }));
            }

            // Standard response
            return(_mapper.Map(_calculatorSetting, new CalculateResponseDto()
            {
                Duty = _duty,
                Tax = _tax,
                Fees = _fees
            }));
        }