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 })); }