public void CalculateTax(OriginAddress originAddress, CustomerOrder customerOrder)
        {
            Website website = customerOrder.Website;

            if (website == null || customerOrder.OrderLines.Count < 1)
            {
                return;
            }
            if (customerOrder.WebsiteId != null)
            {
                customSettings.OverrideCurrentWebsite(customerOrder.WebsiteId);
            }
            var Excert = customerOrder.ShipTo.CustomProperties.Where(x => x.Name.Equals("EXCert", StringComparison.OrdinalIgnoreCase)).FirstOrDefault();

            if (Excert != null && !string.IsNullOrEmpty(Excert.Value))
            {
                customerOrder.StateTax = Decimal.Zero;
                return;
            }

            var taxCalculation = this.TaxesSettings.TaxCalculation;

            if (taxCalculation.ToString().EqualsIgnoreCase("Calculate") && ValidateOrderAddressForAvalara(customerOrder))
            {
                var    requestFromOrder     = GetCalcTaxRequestFromOrder(originAddress, customerOrder, DocumentType.SalesOrder);
                var    configuredTaxService = GetConfiguredTaxService();
                string message1;
                try
                {
                    LogHelper.For(this).Info("AvalaraTax call for Order Number " + customerOrder.OrderNumber, "TaxCalculator_Avalara");

                    //BUSA-481 : Tax Exempt. Truncate country code from customer number Starts.
                    requestFromOrder.CustomerCode = !string.IsNullOrEmpty(requestFromOrder.CustomerCode) ? requestFromOrder.CustomerCode.Trim().Substring(1, requestFromOrder.CustomerCode.Length - 1) : string.Empty;
                    //BUSA-481 : Tax Exempt. Truncate country code from customer number Ends.

                    var tax = configuredTaxService.GetTax(requestFromOrder);
                    message1 = ProcessAvalaraResponseMessage(tax);
                    customerOrder.StateTax = tax.TotalTax;
                }
                catch (Exception ex)
                {
                    LogHelper.For(this).Error("Error running Avalara GetTax method:  " + ex.Message, "TaxCalculator_Avalara");
                    throw;
                }
                if (!string.IsNullOrEmpty(message1))
                {
                    LogHelper.For(this).Debug(message1, "Avalara Result, PostTax: ");
                }
            }
            else
            {
                customerOrder.StateTax = Decimal.Zero;
                string message = !taxCalculation.ToString().EqualsIgnoreCase("Calculate") ? "Select taxcalculation as calculate." : "The billto/shipto customer does not have an address specified. In order to calculate tax this must be set up.";
                LogHelper.For(this).Debug(message, "TaxCalculator_Avalara");
            }
        }
        //BUSA-450 Cenpos - address for New Web Customer is not being populated correctly end

        //protected virtual ProcessCardRequest GetCardRequestForToken(SubmitTransactionParameter parameter)
        //{
        //    customSettings.OverrideCurrentWebsite(SiteContext.Current.WebsiteDto.Id);
        //    ProcessCardRequest processCardRequest1 = null;
        //    if (parameter.PaymentProfileId != null)
        //    {
        //        ProcessCardRecurringSaleRequest recurringSaleRequest = new ProcessCardRecurringSaleRequest();
        //        string userId = customSettings.PaymentGateway_Cenpos_UserId;
        //        recurringSaleRequest.UserId = userId;
        //        string password = customSettings.PaymentGateway_Cenpos_Password;
        //        recurringSaleRequest.Password = password;
        //        int merchantId = customSettings.PaymentGateway_Cenpos_MerchantId;
        //        recurringSaleRequest.MerchantId = merchantId;
        //        Decimal amount = parameter.Amount;
        //        recurringSaleRequest.Amount = amount;
        //        string str1 = parameter.CreditCard.ExpirationMonth.ToString("00") + parameter.CreditCard.ExpirationYear.ToString().Substring(2);
        //        recurringSaleRequest.CardExpirationDate = str1;
        //        string customerNumber = parameter.CustomerNumber;
        //        recurringSaleRequest.CustomerCode = customerNumber;
        //        string address1 = parameter.BillToAddress.Address1;
        //        recurringSaleRequest.CustomerBillingAddress = address1;
        //        string email = parameter.BillToAddress.Email;
        //        recurringSaleRequest.CustomerEmailAddress = email;
        //        string postalCode = parameter.BillToAddress.PostalCode;
        //        recurringSaleRequest.CustomerZipCode = postalCode;
        //        string referenceNumber = parameter.ReferenceNumber;
        //        recurringSaleRequest.InvoiceNumber = referenceNumber; // the invoicenumber in SpForce will be same as original transaction reference number?
        //        string currencyCode = parameter.CurrencyCode;
        //        recurringSaleRequest.CurrencyCode = currencyCode;
        //        // setting SpecialForce for sale transaction type for invoice amount
        //        //recurringSaleRequest.TransactionType = parameter.TransactionType == TransactionType.Sale ? "RecurringSale2" : "RecurringAuth";

        //        switch (parameter.TransactionType)
        //        {
        //            case TransactionType.Authorization:
        //                recurringSaleRequest.TransactionType = "RecurringAuth";
        //                break;
        //            case TransactionType.Capture:
        //                recurringSaleRequest.TransactionType = "RecurringSale2";   //saving card through invoice
        //                break;
        //            case TransactionType.Sale:
        //                recurringSaleRequest.TransactionType = "Sale";             //only payment through invoicing
        //                break;
        //            case TransactionType.Void:
        //                recurringSaleRequest.TransactionType = "Void";
        //                break;
        //            case TransactionType.Credit:
        //                recurringSaleRequest.TransactionType = "Refund";
        //                break;

        //            default : recurringSaleRequest.TransactionType = "RecurringAuth";
        //                break;

        //        }

        //        string str3 = parameter.PaymentProfileId + "|" + (object)merchantId;
        //        recurringSaleRequest.RecurringSaleTokenId = str3;
        //        processCardRequest1 = (ProcessCardRequest)recurringSaleRequest;
        //    }
        //    return processCardRequest1;
        //}

        protected virtual UseTokenRequest GetCardRequestForToken(SubmitTransactionParameter parameter)
        {
            customSettings.OverrideCurrentWebsite(SiteContext.Current.WebsiteDto.Id);
            UseTokenRequest processCardRequest1 = new UseTokenRequest();

            if (parameter.PaymentProfileId != null)
            {
                string userId = customSettings.PaymentGateway_Cenpos_UserId;
                processCardRequest1.UserId = userId;
                string password = customSettings.PaymentGateway_Cenpos_Password;
                processCardRequest1.Password = password;
                int merchantId = customSettings.PaymentGateway_Cenpos_MerchantId;
                processCardRequest1.MerchantId = merchantId;
                Decimal amount = parameter.Amount;
                processCardRequest1.Amount = amount;
                string referenceNumber = parameter.ReferenceNumber;
                processCardRequest1.InvoiceNumber = referenceNumber; // the invoicenumber in SpForce will be same as original transaction reference number?
                string currencyCode = parameter.CurrencyCode;
                processCardRequest1.CurrencyCode = currencyCode;
                // setting SpecialForce for sale transaction type for invoice amount
                //recurringSaleRequest.TransactionType = parameter.TransactionType == TransactionType.Sale ? "RecurringSale2" : "RecurringAuth";
                switch (parameter.TransactionType)
                {
                case TransactionType.Authorization:
                    processCardRequest1.TransactionType = "Auth";
                    break;

                case TransactionType.Capture:
                    processCardRequest1.TransactionType = "RecurringSale2";       //saving card through invoice
                    break;

                case TransactionType.Sale:
                    processCardRequest1.TransactionType = "Sale";                 //only payment through invoicing
                    break;

                case TransactionType.Void:
                    processCardRequest1.TransactionType = "Void";
                    break;

                case TransactionType.Credit:
                    processCardRequest1.TransactionType = "Refund";
                    break;

                default:
                    processCardRequest1.TransactionType = "Auth";
                    break;
                }

                string str3 = parameter.PaymentProfileId + "|" + (object)merchantId;
                processCardRequest1.TokenId = str3;
            }
            return(processCardRequest1);
        }