/// <summary> /// Computes the invoice tax result /// </summary> /// <returns> /// The <see cref="ITaxCalculationResult"/> /// </returns> public override Attempt<ITaxCalculationResult> CalculateTaxesForInvoice() { var extendedData = new ExtendedDataCollection(); try { var baseTaxRate = _taxMethod.PercentageTaxRate; extendedData.SetValue(Core.Constants.ExtendedDataKeys.BaseTaxRate, baseTaxRate.ToString(CultureInfo.InvariantCulture)); if (_taxMethod.HasProvinces) { baseTaxRate = AdjustedRate(baseTaxRate, _taxMethod.Provinces.FirstOrDefault(x => x.Code == TaxAddress.Region), extendedData); } var visitor = new TaxableLineItemVisitor(baseTaxRate / 100); Invoice.Items.Accept(visitor); var totalTax = visitor.TaxableLineItems.Sum(x => decimal.Parse(x.ExtendedData.GetValue(Core.Constants.ExtendedDataKeys.LineItemTaxAmount))); return Attempt<ITaxCalculationResult>.Succeed( new TaxCalculationResult(_taxMethod.Name, baseTaxRate, totalTax, extendedData)); } catch (Exception ex) { return Attempt<ITaxCalculationResult>.Fail(ex); } }
/// <summary> /// Computes the invoice tax result /// </summary> /// <returns> /// The <see cref="ITaxCalculationResult"/> /// </returns> public override Attempt <ITaxCalculationResult> CalculateTaxesForInvoice() { var extendedData = new ExtendedDataCollection(); try { var baseTaxRate = _taxMethod.PercentageTaxRate; extendedData.SetValue(Core.Constants.ExtendedDataKeys.BaseTaxRate, baseTaxRate.ToString(CultureInfo.InvariantCulture)); if (_taxMethod.HasProvinces) { baseTaxRate = AdjustedRate(baseTaxRate, _taxMethod.Provinces.FirstOrDefault(x => x.Code == TaxAddress.Region), extendedData); } var visitor = new TaxableLineItemVisitor(baseTaxRate / 100); Invoice.Items.Accept(visitor); var totalTax = visitor.TaxableLineItems.Sum(x => decimal.Parse(x.ExtendedData.GetValue(Core.Constants.ExtendedDataKeys.LineItemTaxAmount))); return(Attempt <ITaxCalculationResult> .Succeed( new TaxCalculationResult(_taxMethod.Name, baseTaxRate, totalTax, extendedData))); } catch (Exception ex) { return(Attempt <ITaxCalculationResult> .Fail(ex)); } }