public abstract ITaxStructured DoCalc( TaxSession session, IAddress fromAddress, IAddress toAddress, Amount amount, Amount shipping);
public ITaxCalculation Calc( TaxSession session, IAddress wholesellerAddress, string[] wholesellerNexusStates, IAddress retailerAddress, string[] retailerNexusStates, string[] retailerCertificateStates, IAddress shippingAddress, Amount wholesalePrice, Amount retailPrice, Amount shipping) { if (!wholesalePrice.CurrencyISO.EqualsOrdIgnoreCase(retailPrice.CurrencyISO) || !wholesalePrice.CurrencyISO.EqualsOrdIgnoreCase(shipping.CurrencyISO) || !retailPrice.CurrencyISO.EqualsOrdIgnoreCase(shipping.CurrencyISO)) { throw new TaxException(GetType().FullName + StringConsts.TAX_CALC_DIFFERENT_CURRENCIES_ERROR + ".Calc(wholesalePrice='{0}', retailPrice='{1}', shipping='{2}')".Args(wholesalePrice, retailPrice, shipping)); } var currencyISO = retailPrice.CurrencyISO; var wholesellerHasNexus = wholesellerNexusStates.Any(s => s.EqualsOrdIgnoreCase(shippingAddress.Region)); var retailerHasNexus = retailerNexusStates.Any(s => s.EqualsOrdIgnoreCase(shippingAddress.Region)); var retailerHasCertificate = retailerCertificateStates.Any(cs => cs.EqualsOrdIgnoreCase(shippingAddress.Region)); if (wholesellerHasNexus) { if (retailerHasNexus) { if (retailerHasCertificate) { var retailerTax = DoCalc(session, retailerAddress, shippingAddress, retailPrice, shipping); return(new TaxCalculation() { CurrencyISO = currencyISO, Recipient = shippingAddress.Region, RetailerTax = retailerTax }); } else { var wholesellerTax = DoCalc(session, wholesellerAddress, shippingAddress, wholesalePrice, shipping); var retailerTax = DoCalc(session, retailerAddress, shippingAddress, retailPrice, shipping); return(new TaxCalculation() { CurrencyISO = currencyISO, Recipient = shippingAddress.Region, WholesellerTax = wholesellerTax, RetailerTax = retailerTax }); } } else { if (retailerHasCertificate) { return(TaxCalculation.NoneInstance); } else { var wholesellerTax = DoCalc(session, wholesellerAddress, shippingAddress, wholesalePrice, shipping); return(new TaxCalculation() { CurrencyISO = currencyISO, Recipient = shippingAddress.Region, WholesellerTax = wholesellerTax }); } } } else { if (retailerHasNexus) { var retailerTax = DoCalc(session, retailerAddress, shippingAddress, retailPrice, shipping); return(new TaxCalculation() { CurrencyISO = currencyISO, Recipient = shippingAddress.Region, RetailerTax = retailerTax }); } else { return(TaxCalculation.NoneInstance); } } }