public Transaction ProcessOpenBanking(BankPaymentBuilder builder)
        {
            string timestamp = builder.Timestamp ?? GenerationUtils.GenerateTimestamp();
            string orderId   = builder.OrderId ?? GenerationUtils.GenerateOrderId();
            var    amount    = builder.Amount != null?builder.Amount.ToNumericCurrencyString() : null;

            JsonDoc request = new JsonDoc();

            var paymentMethod = builder.PaymentMethod as BankPayment;

            switch (builder.TransactionType)
            {
            case TransactionType.Sale:
                var bankPaymentType = paymentMethod.BankPaymentType != null ?
                                      paymentMethod.BankPaymentType : GetBankPaymentType(builder.Currency);
                string hash = GenerationUtils.GenerateHash(SharedSecret, ShaHashType, timestamp, MerchantId, orderId, amount, builder.Currency,
                                                           !string.IsNullOrEmpty(paymentMethod.SortCode) && bankPaymentType.Equals(BankPaymentType.FASTERPAYMENTS) ?
                                                           paymentMethod.SortCode : "",
                                                           !string.IsNullOrEmpty(paymentMethod.AccountNumber) && bankPaymentType.Equals(BankPaymentType.FASTERPAYMENTS) ?
                                                           paymentMethod.AccountNumber : "",
                                                           !string.IsNullOrEmpty(paymentMethod.Iban) && bankPaymentType.Equals(BankPaymentType.SEPA) ? paymentMethod.Iban : "");
                SetAuthorizationHeader(hash);

                request.Set("request_timestamp", timestamp)
                .Set("merchant_id", MerchantId)
                .Set("account_id", AccountId);

                JsonDoc order = new JsonDoc();
                order.Set("id", orderId)
                .Set("currency", builder.Currency)
                .Set("amount", amount)
                .Set("description", builder.Description);

                JsonDoc payment = new JsonDoc();

                JsonDoc destination = new JsonDoc();
                destination.Set("account_number", bankPaymentType.Equals(BankPaymentType.FASTERPAYMENTS) ? paymentMethod.AccountNumber : null)
                .Set("sort_code", bankPaymentType.Equals(BankPaymentType.FASTERPAYMENTS) ? paymentMethod.SortCode : null)
                .Set("iban", bankPaymentType.Equals(BankPaymentType.SEPA) ? paymentMethod.Iban : null)
                .Set("name", paymentMethod.AccountName);


                JsonDoc remittance_reference = new JsonDoc();
                remittance_reference.Set("type", builder.RemittanceReferenceType != null ? builder.RemittanceReferenceType.ToString() : null)
                .Set("value", builder.RemittanceReferenceValue);

                payment.Set("scheme", bankPaymentType.ToString())
                .Set("destination", destination);

                if (remittance_reference.HasKeys())
                {
                    payment.Set("remittance_reference", remittance_reference);
                }

                request.Set("order", order)
                .Set("payment", payment)
                .Set("return_url", paymentMethod.ReturnUrl)
                .Set("status_url", paymentMethod.StatusUpdateUrl);

                break;

            default:
                break;
            }

            try
            {
                string rawResponse = DoTransaction(HttpMethod.Post, "/payments", request.ToString());
                return(OpenBankingMapping.MapResponse(rawResponse));
            }
            catch (GatewayException gatewayException)
            {
                throw gatewayException;
            }
        }
        public T ProcessReport <T>(ReportBuilder <T> builder) where T : class
        {
            Dictionary <string, string> queryParams = new Dictionary <string, string>();
            string timestamp = GenerationUtils.GenerateTimestamp();

            switch (builder.ReportType)
            {
            case ReportType.FindBankPayment:
                if (builder is TransactionReportBuilder <T> )
                {
                    var    trb       = builder as TransactionReportBuilder <T>;
                    var    accountId = string.IsNullOrEmpty(trb.SearchBuilder.BankPaymentId) ? AccountId : "";
                    string hash      = GenerationUtils.GenerateHash(SharedSecret, ShaHashType, timestamp, MerchantId, accountId,
                                                                    !string.IsNullOrEmpty(trb.SearchBuilder.BankPaymentId) ? trb.SearchBuilder.BankPaymentId : "",
                                                                    trb.SearchBuilder.StartDate.HasValue ? trb.SearchBuilder.StartDate.Value.ToString("yyyyMMddHHmmss") : "",
                                                                    trb.SearchBuilder.EndDate.HasValue ? trb.SearchBuilder.EndDate.Value.ToString("yyyyMMddHHmmss") : "",
                                                                    trb.SearchBuilder.ReturnPII.HasValue ? (trb.SearchBuilder.ReturnPII.Value ? "True" : "False") : "");

                    SetAuthorizationHeader(hash);

                    queryParams.Add("timestamp", timestamp);
                    queryParams.Add("merchantId", MerchantId);
                    if (!string.IsNullOrEmpty(accountId))
                    {
                        queryParams.Add("accountId", accountId);
                    }
                    var obTransId = !string.IsNullOrEmpty(trb.SearchBuilder.BankPaymentId) ? trb.SearchBuilder.BankPaymentId : "";
                    if (!string.IsNullOrEmpty(obTransId))
                    {
                        queryParams.Add("obTransId", obTransId);
                    }
                    var startDate = trb.SearchBuilder.StartDate.HasValue ? trb.SearchBuilder.StartDate.Value.ToString("yyyyMMddHHmmss") : "";
                    if (!string.IsNullOrEmpty(startDate))
                    {
                        queryParams.Add("startDateTime", startDate);
                    }
                    var endDate = trb.SearchBuilder.EndDate.HasValue ? trb.SearchBuilder.EndDate.Value.ToString("yyyyMMddHHmmss") : "";
                    if (!string.IsNullOrEmpty(endDate))
                    {
                        queryParams.Add("endDateTime", endDate);
                    }
                    var transState = trb.SearchBuilder.BankPaymentStatus.HasValue ? trb.SearchBuilder.BankPaymentStatus.Value.ToString() : "";
                    if (!string.IsNullOrEmpty(transState))
                    {
                        queryParams.Add("transactionState", transState);
                    }
                    var returnPii = trb.SearchBuilder.ReturnPII.HasValue ? (trb.SearchBuilder.ReturnPII.Value ? "True" : "False") : "";
                    if (!string.IsNullOrEmpty(returnPii))
                    {
                        queryParams.Add("returnPii", returnPii);
                    }
                }
                break;

            default:
                break;
            }

            try
            {
                string response = DoTransaction(HttpMethod.Get, "/payments", null, queryParams);
                return(OpenBankingMapping.MapReportResponse <T>(response, builder.ReportType));
            }
            catch (GatewayException ex)
            {
                throw ex;
            }
        }