protected override Money CalculateSalesTax(IEnumerable <ILineItem> lineItems, IMarket market, IOrderAddress shippingAddress, Currency currency) { foreach (ILineItem lineItem in lineItems) { lineItem.TaxCategoryId = new int?(GetTaxCategoryId(lineItem)); } decimal amount = new decimal(); foreach (IGrouping <int?, ILineItem> source in lineItems.GroupBy(x => x.TaxCategoryId, x => x)) { IEnumerable <ITaxValue> taxValues = GetTaxValues(source.First(), market, shippingAddress); foreach (ILineItem lineItem in source) { ILineItemCalculatedAmount calculatedAmount = lineItem as ILineItemCalculatedAmount; if (calculatedAmount != null && calculatedAmount.IsSalesTaxUpToDate) { amount += calculatedAmount.SalesTax; } else { Money lineItemSalesTax = CalculateLineItemSalesTax(lineItem, market, GetExtendedPrice(lineItem, currency), taxValues); ValidateSalesTax(lineItemSalesTax); if (calculatedAmount != null) { calculatedAmount.SalesTax = lineItemSalesTax.Amount; calculatedAmount.IsSalesTaxUpToDate = true; } amount += lineItemSalesTax.Amount; } } } return(new Money(amount, currency)); }
private Money CalculateLineItemSalesTax( ILineItem lineItem, IMarket market, Money basePrice, IEnumerable <ITaxValue> taxValues) { ILineItemCalculatedAmount calculatedAmount = lineItem as ILineItemCalculatedAmount; bool flag = calculatedAmount != null ? calculatedAmount.PricesIncludeTax : market.PricesIncludeTax; decimal num = (decimal)taxValues.Where(x => x.TaxType == TaxType.SalesTax).Sum(x => x.Percentage); var amount = basePrice.Amount * num / (flag ? num + new decimal(100) : new decimal(100)); return(new Money(Math.Round(amount, 2, MidpointRounding.AwayFromZero), basePrice.Currency)); }
protected override Money CalculateShippingTax(ILineItem lineItem, IMarket market, IOrderAddress shippingAddress, Money basePrice) { IEnumerable <ITaxValue> taxValues = GetTaxValues(lineItem, market, shippingAddress); if (!taxValues.Any()) { return(new Money(decimal.Zero, basePrice.Currency)); } ILineItemCalculatedAmount calculatedAmount = lineItem as ILineItemCalculatedAmount; bool flag = calculatedAmount != null ? calculatedAmount.PricesIncludeTax : market != null && market.PricesIncludeTax; decimal num = (decimal)taxValues.Where(x => x.TaxType == TaxType.ShippingTax).Sum(x => x.Percentage); var amount = basePrice.Amount * num / (flag ? num + new decimal(100) : new decimal(100)); return(new Money(Math.Round(amount, 2, MidpointRounding.AwayFromZero), basePrice.Currency)); }