public async Task <ValidationResponse> Initialize(MonerisAdminRequest monerisAdminRequest)
        {
            try
            {
                var client = _clientFactory.CreateClient();
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                var monerisRequest = new
                {
                    apiToken    = _config["Moneris:apiToken"],
                    postbackUrl = _config["Moneris:postbackUrl"],
                    storeId     = monerisAdminRequest.StoreId,
                    terminalId  = monerisAdminRequest.TerminalId,
                    txnType     = "initialization"
                };

                var requestString = JsonConvert.SerializeObject(monerisRequest);
                var response      = await client.PostAsync(
                    _config["Moneris:baseUrl"],
                    new StringContent(
                        requestString,
                        Encoding.UTF8,
                        "application/json"));

                var result = await response.Content
                             .ReadAsAsync <ValidationResponse>();

                var date = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, "Pacific Standard Time");

                var monerisLog = new MonerisTransactionLog
                {
                    ClientIp        = monerisAdminRequest.ClientIp,
                    OrderId         = null,
                    Amount          = 0,
                    CreatedDate     = date,
                    Request         = requestString,
                    Response        = JsonConvert.SerializeObject(result),
                    ResponseCode    = result.Receipt.ResponseCode,
                    ResponseMessage = result.Receipt.Message,
                    StoreId         = monerisRequest.storeId,
                    TerminalId      = monerisRequest.terminalId,
                    TransactionType = monerisRequest.txnType,
                    UserId          = monerisAdminRequest.UserId,
                };

                await _context.MonerisTransactionLog.AddAsync(monerisLog);

                await _context.SaveChangesAsync();

                return(result);
            }
            catch (Exception ex)
            {
                _telemetryClient.TrackException(ex);
                return(null);
            }
        }
        public async Task <ValidationResponse> TransactionRequestAsync(TransactionRequest transactionRequest)
        {
            try
            {
                var client = _clientFactory.CreateClient();
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                var clientPosSettings = _context.ClientPosSettings.FirstOrDefault(c => c.ClientIp == transactionRequest.ClientIp);
                if (clientPosSettings == null)
                {
                    _telemetryClient.TrackException(new Exception($"ClientPosSettings missing for client IP: {transactionRequest.ClientIp}"));
                    return(null); // log error, and don't return null dude!
                }

                var monerisRequest = new
                {
                    apiToken    = _config["Moneris:apiToken"],
                    postbackUrl = _config["Moneris:postbackUrl"],
                    storeId     = clientPosSettings.StoreId,
                    terminalId  = clientPosSettings.TerminalId,
                    txnType     = transactionRequest.TransactionType,
                    request     = new
                    {
                        amount  = transactionRequest.Amount.ToString(),
                        orderId = transactionRequest.OrderId.ToString()
                    },
                };
                var requestString = JsonConvert.SerializeObject(monerisRequest);
                var response      = await client.PostAsync(
                    _config["Moneris:baseUrl"],
                    new StringContent(
                        requestString,
                        Encoding.UTF8,
                        "application/json"));

                var result = await response.Content
                             .ReadAsAsync <ValidationResponse>();

                var monerisLog = new MonerisTransactionLog
                {
                    ClientIp        = transactionRequest.ClientIp,
                    OrderId         = transactionRequest.OrderId,
                    Amount          = transactionRequest.Amount,
                    CreatedDate     = transactionRequest.CreatedDate,
                    Request         = requestString,
                    Response        = JsonConvert.SerializeObject(result),
                    ResponseCode    = result.Receipt.ResponseCode,
                    ResponseMessage = result.Receipt.Message,
                    StoreId         = monerisRequest.storeId,
                    TerminalId      = monerisRequest.terminalId,
                    TransactionType = monerisRequest.txnType,
                    UserId          = transactionRequest.UserId,
                };

                await _context.MonerisTransactionLog.AddAsync(monerisLog);

                await _context.SaveChangesAsync();

                return(result);
            }
            catch (Exception ex)
            {
                _telemetryClient.TrackException(ex);
                return(null);
            }
        }