Example #1
0
        public static DeviceMessage BuildUpaAdminRequest(int requestId, string ecrId, string txnType, string lineItemLeft = null, string lineItemRight = null, int?displayOption = null)
        {
            var doc = new JsonDoc();

            doc.Set("message", UpaMessageType.Msg);
            var data = doc.SubElement("data");

            data.Set("command", txnType);
            data.Set("EcrId", ecrId);
            data.Set("requestId", requestId);

            if ((!string.IsNullOrEmpty(lineItemLeft) || !string.IsNullOrEmpty(lineItemRight)) || displayOption.HasValue)
            {
                var request       = data.SubElement("data");
                var requestParams = request.SubElement("params");
                requestParams.Set("lineItemLeft", lineItemLeft);
                requestParams.Set("lineItemRight", lineItemRight);
                if (displayOption.HasValue)
                {
                    requestParams.Set("displayOption", displayOption);
                }
            }

            return(BuildUpaRequest(doc.ToString()));
        }
Example #2
0
        internal IDeviceMessage BuildReportTransaction(TerminalReportBuilder builder)
        {
            var requestId = builder.SearchBuilder.ReferenceNumber;

            if (requestId == default(string) && RequestIdProvider != null)
            {
                requestId = RequestIdProvider.GetRequestId().ToString();
            }

            var doc = new JsonDoc();

            doc.Set("message", "MSG");

            var baseRequest = doc.SubElement("data");

            baseRequest.Set("command", MapReportType(builder.ReportType));
            if (!(builder.SearchBuilder.EcrId == null))
            {
                baseRequest.Set("EcrId", builder.SearchBuilder.EcrId);
            }
            baseRequest.Set("requestId", requestId.ToString());

            if (builder.ReportType == TerminalReportType.GetOpenTabDetails)
            {
                return(TerminalUtilities.BuildUpaRequest(doc.ToString()));
            }

            var txnData   = baseRequest.SubElement("data");
            var txnParams = txnData.SubElement("params");

            txnParams.Set("reportOutput", builder.SearchBuilder.ReportOutput);
            txnParams.Set("batch", builder.SearchBuilder.Batch);

            return(TerminalUtilities.BuildUpaRequest(doc.ToString()));
        }
Example #3
0
 private JsonDoc BuildAmount(JsonDoc request, string name, decimal?amount, string currency, TransactionType type)
 {
     if (amount.HasValue)
     {
         var node = request.SubElement(name);
         node.Set("value", amount.ToNumericCurrencyString());
         if (type == TransactionType.Create)
         {
             node.Set("currency", currency);
         }
     }
     return(request);
 }
Example #4
0
        internal IDeviceMessage BuildManageTransaction(TerminalManageBuilder builder)
        {
            var transType     = builder.TransactionType;
            var transModifier = builder.TransactionModifier;
            int requestId     = builder.ReferenceNumber;

            if (requestId == default(int) && RequestIdProvider != null)
            {
                requestId = RequestIdProvider.GetRequestId();
            }

            var doc = new JsonDoc();

            doc.Set("message", "MSG");

            var baseRequest = doc.SubElement("data");

            // Possibly update the requestToken parameter in the future if necessary
            baseRequest.Set("command", MapTransactionType(transType, transModifier, false, builder.Gratuity));
            baseRequest.Set("EcrId", builder.EcrId.ToString());
            baseRequest.Set("requestId", requestId.ToString());

            var txnData = baseRequest.SubElement("data");

            var transaction = txnData.SubElement("transaction");

            transaction.Set("referenceNumber", builder.TransactionId ?? StringUtils.PadLeft(builder.TerminalRefNumber, 4, '0'));
            transaction.Set("amount", ToCurrencyString(builder.Amount));
            transaction.Set("taxAmount", ToCurrencyString(builder.TaxAmount));
            transaction.Set("tipAmount", ToCurrencyString(builder.Gratuity));
            transaction.Set("taxIndicator", builder.TaxExempt);
            transaction.Set("invoiceNbr", builder.InvoiceNumber);
            transaction.Set("processCPC", builder.ProcessCPC);

            return(TerminalUtilities.BuildUpaRequest(doc.ToString()));
        }
Example #5
0
        private JsonDoc BuildPaymentMethod(JsonDoc request, RecurringPaymentMethod payment, TransactionType type)
        {
            if (payment != null)
            {
                request.Set("preferredPayment", payment.PreferredPayment);
                request.Set("paymentMethodIdentifier", payment.Id);
                request.Set("customerKey", payment.CustomerKey);
                request.Set("nameOnAccount", payment.NameOnAccount);
                BuildAddress(request, payment.Address);

                if (type == TransactionType.Create)
                {
                    string  tokenValue  = null;
                    var     hasToken    = HasToken(payment.PaymentMethod, out tokenValue);
                    JsonDoc paymentInfo = null;
                    if (payment.PaymentMethod is ICardData)
                    {
                        var method = payment.PaymentMethod as ICardData;
                        paymentInfo = request.SubElement(hasToken ? "alternateIdentity" : "card")
                                      .Set("type", hasToken ? "SINGLEUSETOKEN" : null)
                                      .Set(hasToken ? "token" : "number", hasToken ? tokenValue : method.Number)
                                      .Set("expMon", method.ExpMonth)
                                      .Set("expYear", method.ExpYear);
                        request.Set("cardVerificationValue", method.Cvn);
                    }
                    else if (payment.PaymentMethod is ITrackData)
                    {
                        var method = payment.PaymentMethod as ITrackData;
                        paymentInfo = request.SubElement("track")
                                      .Set("data", method.Value)
                                      .Set("dataEntryMode", method.EntryMethod.ToString().ToUpper());
                    }
                    else if (payment.PaymentMethod is eCheck)
                    {
                        var check = payment.PaymentMethod as eCheck;
                        request.Set("achType", check.AccountType.ToInitialCase())
                        .Set("accountType", check.CheckType.ToInitialCase())
                        .Set("telephoneIndicator", (check.SecCode == SecCode.CCD || check.SecCode == SecCode.PPD) ? false : true)
                        .Set("routingNumber", check.RoutingNumber)
                        .Set("accountNumber", check.AccountNumber)
                        .Set("accountHolderYob", check.BirthYear.ToString())
                        .Set("driversLicenseState", check.DriversLicenseState)
                        .Set("driversLicenseNumber", check.DriversLicenseNumber)
                        .Set("socialSecurityNumberLast4", check.SsnLast4);
                        request.Remove("country");
                    }

                    if (payment.PaymentMethod is IEncryptable)
                    {
                        var enc = (payment.PaymentMethod as IEncryptable).EncryptionData;
                        if (enc != null)
                        {
                            paymentInfo.Set("trackNumber", enc.TrackNumber);
                            paymentInfo.Set("key", enc.KTB);
                            paymentInfo.Set("encryptionType", "E3");
                        }
                    }
                }
                else   // EDIT FIELDS
                {
                    request.Remove("customerKey");
                    request.Set("paymentStatus", payment.Status);
                    request.Set("cpcTaxType", payment.TaxType);
                    request.Set("expirationDate", payment.ExpirationDate);
                }
            }
            return(request);
        }
Example #6
0
        public Transaction ProcessSecure3d(Secure3dBuilder builder)
        {
            TransactionType transType     = builder.TransactionType;
            IPaymentMethod  paymentMethod = builder.PaymentMethod;
            ISecure3d       secure3d      = (ISecure3d)paymentMethod;
            string          timestamp     = DateTime.Now.ToString("yyyy-MM-dd'T'hh:mm:ss.ffffff");

            JsonDoc request = new JsonDoc();

            if (transType.Equals(TransactionType.VerifyEnrolled))
            {
                request.Set("request_timestamp", timestamp);
                request.Set("merchant_id", MerchantId);
                request.Set("account_id", AccountId);
                request.Set("method_notification_url", MethodNotificationUrl);

                string hashValue = string.Empty;
                if (paymentMethod is CreditCardData cardData)
                {
                    request.Set("number", cardData.Number);
                    request.Set("scheme", MapCardScheme(cardData.CardType.ToUpper()));
                    hashValue = cardData.Number;
                }
                else if (paymentMethod is RecurringPaymentMethod storedCard)
                {
                    request.Set("payer_reference", storedCard.CustomerKey);
                    request.Set("payment_method_reference", storedCard.Key);
                    hashValue = storedCard.CustomerKey;
                }

                string hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, hashValue);
                SetAuthHeader(hash);

                string rawResponse = DoTransaction(HttpMethod.Post, "protocol-versions", request.ToString());
                return(MapResponse(rawResponse));
            }
            else if (transType.Equals(TransactionType.VerifySignature))
            {
                string hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, builder.ServerTransactionId);
                SetAuthHeader(hash);

                var queryValues = new Dictionary <string, string>();
                queryValues.Add("merchant_id", MerchantId);
                queryValues.Add("request_timestamp", timestamp);

                string rawResponse = DoTransaction(HttpMethod.Get, string.Format("authentications/{0}", builder.ServerTransactionId), null, queryValues);
                return(MapResponse(rawResponse));
            }
            else if (transType.Equals(TransactionType.InitiateAuthentication))
            {
                string orderId = builder.OrderId;
                if (string.IsNullOrEmpty(orderId))
                {
                    orderId = GenerationUtils.GenerateOrderId();
                }
                ThreeDSecure secureEcom = secure3d.ThreeDSecure;

                request.Set("request_timestamp", timestamp);
                request.Set("authentication_source", builder.AuthenticationSource.ToString());
                request.Set("authentication_request_type", builder.AuthenticationRequestType.ToString());
                request.Set("message_category", builder.MessageCategory.ToString());
                request.Set("message_version", "2.1.0");
                request.Set("server_trans_id", secureEcom.ServerTransactionId);
                request.Set("merchant_id", MerchantId);
                request.Set("account_id", AccountId);
                request.Set("challenge_notification_url", ChallengeNotificationUrl);
                request.Set("method_url_completion", builder.MethodUrlCompletion.ToString());
                request.Set("merchant_contact_url", MerchantContactUrl);
                request.Set("merchant_initiated_request_type", builder.MerchantInitiatedRequestType?.ToString());
                request.Set("whitelist_status", builder.WhitelistStatus);
                request.Set("decoupled_flow_request", builder.DecoupledFlowRequest);
                request.Set("decoupled_flow_timeout", builder.DecoupledFlowTimeout);
                request.Set("decoupled_notification_url", builder.DecoupledNotificationUrl);
                request.Set("enable_exemption_optimization", builder.EnableExemptionOptimization);

                // card details
                string  hashValue  = string.Empty;
                JsonDoc cardDetail = request.SubElement("card_detail");
                if (paymentMethod is CreditCardData cardData)
                {
                    hashValue = cardData.Number;
                    cardDetail.Set("number", cardData.Number);
                    cardDetail.Set("scheme", cardData.CardType.ToUpper());
                    cardDetail.Set("expiry_month", cardData.ExpMonth.ToString());
                    cardDetail.Set("expiry_year", cardData.ExpYear.ToString().Substring(2));
                    cardDetail.Set("full_name", cardData.CardHolderName);

                    if (!string.IsNullOrEmpty(cardData.CardHolderName))
                    {
                        string[] names = cardData.CardHolderName.Split(' ');
                        if (names.Length >= 1)
                        {
                            cardDetail.Set("first_name", names[0]);
                        }
                        if (names.Length >= 2)
                        {
                            cardDetail.Set("last_name", string.Join(" ", names.Skip(1)));
                        }
                    }
                }
                else if (paymentMethod is RecurringPaymentMethod storedCard)
                {
                    hashValue = storedCard.CustomerKey;
                    cardDetail.Set("payer_reference", storedCard.CustomerKey);
                    cardDetail.Set("payment_method_reference", storedCard.Key);
                }

                // order details
                JsonDoc order = request.SubElement("order");
                order.Set("amount", builder.Amount.ToNumericCurrencyString());
                order.Set("currency", builder.Currency);
                order.Set("id", orderId);
                order.Set("address_match_indicator", builder.AddressMatchIndicator ? "true" : "false");
                order.Set("date_time_created", builder.OrderCreateDate?.ToString("yyyy-MM-dd'T'hh:mm'Z'"));
                order.Set("gift_card_count", builder.GiftCardCount);
                order.Set("gift_card_currency", builder.GiftCardCurrency);
                order.Set("gift_card_amount", builder.GiftCardAmount.ToNumericCurrencyString());
                order.Set("delivery_email", builder.DeliveryEmail);
                order.Set("delivery_timeframe", builder.DeliveryTimeframe?.ToString());
                order.Set("shipping_method", builder.ShippingMethod?.ToString());
                order.Set("shipping_name_matches_cardholder_name", builder.ShippingNameMatchesCardHolderName);
                order.Set("preorder_indicator", builder.PreOrderIndicator?.ToString());
                order.Set("reorder_indicator", builder.ReorderIndicator?.ToString());
                order.Set("transaction_type", builder.OrderTransactionType?.ToString());
                order.Set("preorder_availability_date", builder.PreOrderAvailabilityDate?.ToString("yyyy-MM-dd"));

                // shipping address
                Address shippingAddress = builder.ShippingAddress;
                if (shippingAddress != null)
                {
                    JsonDoc shippingAddressElement = order.SubElement("shipping_address");
                    shippingAddressElement.Set("line1", shippingAddress.StreetAddress1);
                    shippingAddressElement.Set("line2", shippingAddress.StreetAddress2);
                    shippingAddressElement.Set("line3", shippingAddress.StreetAddress3);
                    shippingAddressElement.Set("city", shippingAddress.City);
                    shippingAddressElement.Set("postal_code", shippingAddress.PostalCode);
                    shippingAddressElement.Set("state", shippingAddress.State);
                    shippingAddressElement.Set("country", shippingAddress.CountryCode);
                }

                // payer
                JsonDoc payer = request.SubElement("payer");
                payer.Set("email", builder.CustomerEmail);
                payer.Set("id", builder.CustomerAccountId);
                payer.Set("account_age", builder.AccountAgeIndicator?.ToString());
                payer.Set("account_creation_date", builder.AccountCreateDate?.ToString("yyyy-MM-dd"));
                payer.Set("account_change_indicator", builder.AccountChangeIndicator?.ToString());
                payer.Set("account_change_date", builder.AccountChangeDate?.ToString("yyyy-MM-dd"));
                payer.Set("account_password_change_indicator", builder.PasswordChangeIndicator?.ToString());
                payer.Set("account_password_change_date", builder.PasswordChangeDate?.ToString("yyyy-MM-dd"));
                payer.Set("payment_account_age_indicator", builder.PaymentAgeIndicator?.ToString());
                payer.Set("payment_account_creation_date", builder.PaymentAccountCreateDate?.ToString("yyyy-MM-dd"));
                payer.Set("purchase_count_last_6months", builder.NumberOfPurchasesInLastSixMonths);
                payer.Set("transaction_count_last_24hours", builder.NumberOfTransactionsInLast24Hours);
                payer.Set("transaction_count_last_year", builder.NumberOfTransactionsInLastYear);
                payer.Set("provision_attempt_count_last_24hours", builder.NumberOfAddCardAttemptsInLast24Hours);
                payer.Set("shipping_address_creation_indicator", builder.ShippingAddressUsageIndicator?.ToString());
                payer.Set("shipping_address_creation_date", builder.ShippingAddressCreateDate?.ToString("yyyy-MM-dd"));

                // suspicious activity
                if (builder.PreviousSuspiciousActivity != null)
                {
                    payer.Set("suspicious_account_activity", builder.PreviousSuspiciousActivity.Value ? "SUSPICIOUS_ACTIVITY" : "NO_SUSPICIOUS_ACTIVITY");
                }

                // home phone
                if (!string.IsNullOrEmpty(builder.HomeNumber))
                {
                    payer.SubElement("home_phone")
                    .Set("country_code", builder.HomeCountryCode)
                    .Set("subscriber_number", builder.HomeNumber);
                }

                // work phone
                if (!string.IsNullOrEmpty(builder.WorkNumber))
                {
                    payer.SubElement("work_phone")
                    .Set("country_code", builder.WorkCountryCode)
                    .Set("subscriber_number", builder.WorkNumber);
                }

                // payer login data
                if (builder.HasPayerLoginData)
                {
                    request.SubElement("payer_login_data")
                    .Set("authentication_data", builder.CustomerAuthenticationData)
                    .Set("authentication_timestamp", builder.CustomerAuthenticationTimestamp?.ToString("yyyy-MM-dd'T'HH:mm:ss.fff'Z'"))
                    .Set("authentication_type", builder.CustomerAuthenticationMethod?.ToString());
                }

                // prior authentication data
                if (builder.HasPriorAuthenticationData)
                {
                    request.SubElement("payer_prior_three_ds_authentication_data")
                    .Set("authentication_method", builder.PriorAuthenticationMethod?.ToString())
                    .Set("acs_transaction_id", builder.PriorAuthenticationTransactionId)
                    .Set("authentication_timestamp", builder.PriorAuthenticationTimestamp?.ToString("yyyy-MM-dd'T'HH:mm:ss.fff'Z'"))
                    .Set("authentication_data", builder.PriorAuthenticationData);
                }

                // recurring authorization data
                if (builder.HasRecurringAuthData)
                {
                    request.SubElement("recurring_authorization_data")
                    .Set("max_number_of_instalments", builder.MaxNumberOfInstallments)
                    .Set("frequency", builder.RecurringAuthorizationFrequency)
                    .Set("expiry_date", builder.RecurringAuthorizationExpiryDate?.ToString("yyyy-MM-dd"));
                }

                // billing details
                Address billingAddress = builder.BillingAddress;
                if (billingAddress != null)
                {
                    JsonDoc billingAddressElement = payer.SubElement("billing_address");
                    billingAddressElement.Set("line1", billingAddress.StreetAddress1);
                    billingAddressElement.Set("line2", billingAddress.StreetAddress2);
                    billingAddressElement.Set("line3", billingAddress.StreetAddress3);
                    billingAddressElement.Set("city", billingAddress.City);
                    billingAddressElement.Set("postal_code", billingAddress.PostalCode);
                    billingAddressElement.Set("state", billingAddress.State);
                    billingAddressElement.Set("country", billingAddress.CountryCode);
                }

                // mobile phone
                if (!string.IsNullOrEmpty(builder.MobileNumber))
                {
                    JsonDoc mobilePhone = payer.SubElement("mobile_phone");
                    mobilePhone.Set("country_code", builder.MobileCountryCode);
                    mobilePhone.Set("subscriber_number", builder.MobileNumber);
                }

                // browser_data
                BrowserData broswerData = builder.BrowserData;
                if (broswerData != null)
                {
                    JsonDoc browserDataElement = request.SubElement("browser_data");
                    browserDataElement.Set("accept_header", broswerData.AcceptHeader);
                    browserDataElement.Set("color_depth", broswerData.ColorDepth.ToString());
                    browserDataElement.Set("ip", broswerData.IpAddress);
                    browserDataElement.Set("java_enabled", broswerData.JavaEnabled);
                    browserDataElement.Set("javascript_enabled", broswerData.JavaScriptEnabled);
                    browserDataElement.Set("language", broswerData.Language);
                    browserDataElement.Set("screen_height", broswerData.ScreenHeight);
                    browserDataElement.Set("screen_width", broswerData.ScreenWidth);
                    browserDataElement.Set("challenge_window_size", broswerData.ChallengeWindowSize.ToString());
                    browserDataElement.Set("timezone", broswerData.Timezone);
                    browserDataElement.Set("user_agent", broswerData.UserAgent);
                }

                // mobile fields
                if (builder.HasMobileFields)
                {
                    JsonDoc sdkInformationElement = request.SubElement("sdk_information")
                                                    .Set("application_id", builder.ApplicationId)
                                                    .Set("ephemeral_public_key", builder.EphemeralPublicKey)
                                                    .Set("maximum_timeout", builder.MaximumTimeout)
                                                    .Set("reference_number", builder.ReferenceNumber)
                                                    .Set("sdk_trans_id", builder.SdkTransactionId)
                                                    .Set("encoded_data", builder.EncodedData)
                    ;

                    // device render options
                    if (builder.SdkInterface != null || builder.SdkUiTypes != null)
                    {
                        var dro = sdkInformationElement.SubElement("device_render_options");
                        dro.Set("sdk_interface", builder.SdkInterface?.ToString());
                        if (builder.SdkUiTypes != null)
                        {
                            var uiTypes = new List <string>();
                            foreach (var sdkuiType in builder.SdkUiTypes)
                            {
                                uiTypes.Add(sdkuiType.ToString());
                            }
                            dro.Set("sdk_ui_type", uiTypes.ToArray());
                        }
                    }
                }

                string hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, hashValue, secureEcom.ServerTransactionId);
                SetAuthHeader(hash);

                string rawResponse = DoTransaction(HttpMethod.Post, "authentications", request.ToString());
                return(MapResponse(rawResponse));
            }

            throw new ApiException(string.Format("Unknown transaction type {0}.", transType));
        }
Example #7
0
        internal IDeviceMessage BuildProcessTransaction(TerminalAuthBuilder builder)
        {
            var  pmt           = builder.PaymentMethodType;
            var  transType     = builder.TransactionType;
            var  transModifier = builder.TransactionModifier;
            bool isTipAdjust   = IsTipAdjust(transType, builder.Gratuity);
            bool isCardHSAFSA  = IsCardHSAFSA(builder.AutoSubstantiation);

            if (pmt != PaymentMethodType.Credit && pmt != PaymentMethodType.Debit && pmt != PaymentMethodType.EBT)
            {
                throw new UnsupportedTransactionException("The supplied payment method type is not supported");
            }

            int requestId = builder.ReferenceNumber;

            if (requestId == default(int) && RequestIdProvider != null)
            {
                requestId = RequestIdProvider.GetRequestId();
            }

            var doc = new JsonDoc();

            doc.Set("message", "MSG");

            var baseRequest = doc.SubElement("data");

            baseRequest.Set("command", MapTransactionType(transType, transModifier, builder.RequestMultiUseToken, builder.Gratuity));
            baseRequest.Set("EcrId", builder.EcrId.ToString());
            baseRequest.Set("requestId", requestId.ToString());

            if (transType != TransactionType.Balance)
            {
                var txnData = baseRequest.SubElement("data");

                var txnParams = txnData.SubElement("params");
                txnParams.Set("clerkId", builder.ClerkId);
                if (transType == TransactionType.Tokenize || transType == TransactionType.Verify)
                {
                    txnParams.Set("cardIsHSAFSA", isCardHSAFSA ? "1" : "0");
                }
                if (!IsTokenRequestApplicable(isTipAdjust, transType))
                {
                    txnParams.Set("tokenRequest", builder.RequestMultiUseToken ? "1" : "0");
                }
                if (builder.PaymentMethod is CreditCardData)
                {
                    txnParams.Set("tokenValue", ((CreditCardData)builder.PaymentMethod).Token);
                }
                if (builder.RequestMultiUseToken && (transType == TransactionType.Sale || transType == TransactionType.Refund || transType == TransactionType.Verify ||
                                                     transType == TransactionType.Auth))
                {
                    if (builder.CardOnFileIndicator != null)
                    {
                        txnParams.Set("cardOnFileIndicator", EnumConverter.GetMapping(Target.UPA, builder.CardOnFileIndicator));
                    }
                    txnParams.Set("cardBrandTransId", builder.CardBrandTransId);
                }
                txnParams.Set("lineItemLeft", builder.LineItemLeft);
                txnParams.Set("lineItemRight", builder.LineItemRight);
                txnParams.Set("directMktInvoiceNbr", builder.InvoiceNumber);

                if (builder.ShippingDate != DateTime.MinValue)
                {
                    txnParams.Set("directMktShipMonth", builder.ShippingDate.Month.ToString("00"));
                    txnParams.Set("directMktShipDay", builder.ShippingDate.Day.ToString("00"));
                }

                if (transType != TransactionType.Verify && transType != TransactionType.Refund && !isTipAdjust && transType != TransactionType.Tokenize)
                {
                    var transaction = txnData.SubElement("transaction");
                    if (transType == TransactionType.Auth)
                    {
                        transaction.Set("amount", ToCurrencyString(builder.Amount));
                    }
                    else
                    {
                        transaction.Set("baseAmount", ToCurrencyString(builder.Amount));
                        transaction.Set("cashBackAmount", ToCurrencyString(builder.CashBackAmount));
                        transaction.Set("tipAmount", ToCurrencyString(builder.Gratuity));
                        transaction.Set("taxIndicator", builder.TaxExempt);
                        transaction.Set("invoiceNbr", builder.InvoiceNumber);
                        transaction.Set("processCPC", builder.ProcessCPC);
                        transaction.Set("taxAmount", ToCurrencyString(builder.TaxAmount));
                    }

                    transaction.Set("referenceNumber", builder.TerminalRefNumber);
                    transaction.Set("cardIsHSAFSA", isCardHSAFSA ? "1" : "0");


                    transaction.Set("prescriptionAmount", ToCurrencyString(builder.PrescriptionAmount));
                    transaction.Set("clinicAmount", ToCurrencyString(builder.ClinicAmount));
                    transaction.Set("dentalAmount", ToCurrencyString(builder.DentalAmount));
                    transaction.Set("visionOpticalAmount", ToCurrencyString(builder.VisionOpticalAmount));
                }

                if (transType == TransactionType.Refund)
                {
                    var transaction = txnData.SubElement("transaction");
                    transaction.Set("totalAmount", ToCurrencyString(builder.Amount));
                }

                if (isTipAdjust)
                {
                    var transaction = txnData.SubElement("transaction");
                    transaction.Set("tranNo", builder.TerminalRefNumber);
                    transaction.Set("tipAmount", ToCurrencyString(builder.Gratuity));
                }
            }

            return(TerminalUtilities.BuildUpaRequest(doc.ToString()));
        }