public async Task <string> HpsPaymentGateway(HpsPaymentPayload payload)
        {
            HpsPaymentRequest request = new HpsPaymentRequestBuilder()
                                        .AddServiceConsumer(_settings.Consumer)
                                        .AddPayload(payload).Build();

            HpsPaymentResponse result =
                JsonConvert.DeserializeObject <HpsPaymentResponse>(JsonConvert.SerializeObject(await _proxy.HPSPaymentGateway.POSTAsync(request)));

            if (result.Errors.HasErrors)
            {
                throw new HrblRestApiException(result.Errors.ErrorMessage);
            }

            return(result.PaymentResponse.TransactionID);
        }
        internal HpsPaymentRequestBuilder AddPayload(HpsPaymentPayload payload)
        {
            #region Validation
            StringBuilder issues = new StringBuilder();

            if (string.IsNullOrWhiteSpace(payload.Country) || payload.Country.Trim().Length != 2)
            {
                issues.AppendLine($"Invalid country '{payload.Country}'");
            }

            if (string.IsNullOrWhiteSpace(payload.OrderNumber))
            {
                issues.AppendLine("Order number is mandatory");
            }

            if (string.IsNullOrWhiteSpace(payload.DistributorId))
            {
                issues.AppendLine("Distributor id is mandatory");
            }

            if (string.IsNullOrWhiteSpace(payload.Currency))
            {
                issues.AppendLine("Currency is mandatory");
            }

            decimal amount = 0m;
            if (!decimal.TryParse(payload.Amount.Replace(",", "."), out amount))
            {
                issues.AppendLine("Invalid order total due");
            }
            else if (amount <= 0)
            {
                issues.AppendLine("Amount must be positive");
            }

            if (string.IsNullOrWhiteSpace(payload.CreditCardNumTokenized))
            {
                issues.AppendLine("Card number is mandatory");
            }

            if (string.IsNullOrWhiteSpace(payload.CVV2))
            {
                issues.AppendLine("CVV2 is mandatory");
            }

            if (string.IsNullOrWhiteSpace(payload.ProcessingLocation))
            {
                issues.AppendLine("Processing location is mandatory");
            }

            if ((payload.ExpiryDate.Month < DateTime.Now.Month &&
                 payload.ExpiryDate.Year == DateTime.Now.Year) || payload.ExpiryDate.Year < DateTime.Now.Year)
            {
                issues.AppendLine("Invalid card expiration date");
            }

            if (issues.Length > 0)
            {
                throw new ArgumentException(issues.ToString());
            }
            #endregion

            _request.PaymentRequest.Country                = payload.Country;
            _request.PaymentRequest.OrderNumber            = payload.OrderNumber;
            _request.PaymentRequest.ClientRefNum           = payload.ClientRefNum;
            _request.PaymentRequest.DistributorId          = payload.DistributorId;
            _request.PaymentRequest.PayCode                = payload.PayCode;
            _request.PaymentRequest.Currency               = payload.Currency;
            _request.PaymentRequest.Amount                 = payload.Amount;
            _request.PaymentRequest.CardHolderName         = payload.CardHolderName;
            _request.PaymentRequest.CreditCardNumTokenized = payload.CreditCardNumTokenized;
            _request.PaymentRequest.ExpiryDate             = payload.ExpiryDate;
            _request.PaymentRequest.CVV2               = payload.CVV2;
            _request.PaymentRequest.PayeeID            = payload.PayeeID;
            _request.PaymentRequest.Address1           = payload.Address1;
            _request.PaymentRequest.City               = payload.City;
            _request.PaymentRequest.PostalCode         = payload.PostalCode;
            _request.PaymentRequest.ProcessingLocation = payload.ProcessingLocation;
            _request.PaymentRequest.OrderType          = payload.OrderType;

            return(this);
        }