public void Test_033_Settlement() { BatchSummary response = BatchService.CloseBatch(); Assert.IsNotNull(response); Assert.AreEqual("00", response.ResponseCode); }
public void Test_000_batch_close() { BatchSummary summary = BatchService.CloseBatch(BatchCloseType.Forced); Assert.IsNotNull(summary); Assert.IsTrue(summary.IsBalanced); }
public void SettleBatch() { BatchSummary response = BatchService.CloseBatch(); Assert.IsNotNull(response); Assert.AreEqual("SUCCESS", response.Status); }
private static void AssertBatchCloseResponse(BatchSummary batchSummary, decimal amount) { Assert.IsNotNull(batchSummary); Assert.AreEqual(CLOSED, batchSummary?.Status); Assert.IsTrue(batchSummary?.TransactionCount >= 1); Assert.IsTrue(batchSummary?.TotalAmount >= amount); }
public void BatchExecuteOneResultSet() { const int resultSets = 1; ConnectionInfo ci = Common.CreateTestConnectionInfo(new[] { Common.StandardTestData }, false); // Setup: Create a callback for batch completion BatchSummary batchSummaryFromCallback = null; Batch.BatchAsyncEventHandler batchCallback = b => { batchSummaryFromCallback = b.Summary; return(Task.FromResult(0)); }; // ... Create a callback for result set completion bool resultCallbackFired = false; ResultSet.ResultSetAsyncEventHandler resultSetCallback = r => { resultCallbackFired = true; return(Task.FromResult(0)); }; // If I execute a query that should get one result set var fileStreamFactory = Common.GetFileStreamFactory(new Dictionary <string, byte[]>()); Batch batch = new Batch(Common.StandardQuery, Common.SubsectionDocument, Common.Ordinal, fileStreamFactory); batch.BatchCompletion += batchCallback; batch.ResultSetCompletion += resultSetCallback; batch.Execute(GetConnection(ci), CancellationToken.None).Wait(); // Then: // ... It should have executed without error Assert.True(batch.HasExecuted, "The batch should have been marked executed."); Assert.False(batch.HasError, "The batch should not have an error"); // ... There should be exactly one result set Assert.Equal(resultSets, batch.ResultSets.Count); Assert.Equal(resultSets, batch.ResultSummaries.Length); // ... Inside the result set should be with 5 rows Assert.Equal(Common.StandardRows, batch.ResultSets.First().RowCount); Assert.Equal(Common.StandardRows, batch.ResultSummaries[0].RowCount); // ... Inside the result set should have 5 columns Assert.Equal(Common.StandardColumns, batch.ResultSets.First().Columns.Length); Assert.Equal(Common.StandardColumns, batch.ResultSummaries[0].ColumnInfo.Length); // ... There should be a message for how many rows were affected Assert.Equal(resultSets, batch.ResultMessages.Count()); // ... The callback for batch completion should have been fired Assert.NotNull(batchSummaryFromCallback); // ... The callback for resultset completion should have been fired Assert.True(resultCallbackFired); // We only want to validate that it happened, validation of the // summary is done in result set tests }
public void BatchExecuteInvalidQuery() { // Setup: // ... Create a callback for batch start bool batchStartCalled = false; Batch.BatchAsyncEventHandler batchStartCallback = b => { batchStartCalled = true; return(Task.FromResult(0)); }; // ... Create a callback for batch completion BatchSummary batchSummaryFromCallback = null; Batch.BatchAsyncEventHandler batchCompleteCallback = b => { batchSummaryFromCallback = b.Summary; return(Task.FromResult(0)); }; // ... Create a callback that will fail the test if it's called ResultSet.ResultSetAsyncEventHandler resultSetCallback = r => { throw new Exception("ResultSet callback was called when it should not have been."); }; ConnectionInfo ci = Common.CreateTestConnectionInfo(null, true); // If I execute a batch that is invalid var fileStreamFactory = Common.GetFileStreamFactory(new Dictionary <string, byte[]>()); Batch batch = new Batch(Common.StandardQuery, Common.SubsectionDocument, Common.Ordinal, fileStreamFactory); batch.BatchStart += batchStartCallback; batch.BatchCompletion += batchCompleteCallback; batch.ResultSetCompletion += resultSetCallback; batch.Execute(GetConnection(ci), CancellationToken.None).Wait(); // Then: // ... It should have executed with error Assert.True(batch.HasExecuted); Assert.True(batch.HasError); // ... There should be no result sets Assert.Empty(batch.ResultSets); Assert.Empty(batch.ResultSummaries); // ... There should be plenty of messages for the error Assert.NotEmpty(batch.ResultMessages); // ... The callback for batch completion should have been fired Assert.NotNull(batchSummaryFromCallback); // ... The callback for batch start should have been fired Assert.True(batchStartCalled); }
public async Task HappyFlowHeavyPooledBatches() { // 5B (5000m) on i9-9900 takes about 25secs.. bottle-necked by producer thread. (Release build) long expectPayloadCount = 5000000000; TestContext.WriteLine($"Pipe allocation {_stopwatch.Elapsed}"); IPipe <long> sut = new BatchingPipe <long>(100000000); TestContext.WriteLine($"Pipe allocation complete {_stopwatch.Elapsed}"); // with unlimited buffer, test run was sitting between 3-16GB of ram usage. Task producingTask = RunProducingTask(sut, expectPayloadCount, Int32.MaxValue); TestContext.WriteLine($"Consumer stating {_stopwatch.Elapsed}"); ConcurrentBag <BatchSummary> results = new ConcurrentBag <BatchSummary>(); await sut .ToPacketsAsyncEnumerable() .ParallelForEachAsync((packet, index) => { try { results.Add(BatchSummary.Validate(packet, index)); return(Task.CompletedTask); } finally { packet.Dispose(); } } ); TestContext.WriteLine($"Consumer completed {_stopwatch.Elapsed}"); Assert.IsTrue(producingTask.IsCompletedSuccessfully); BatchSummary[] resultsArray = results .Where(p => !p.Empty) .OrderBy(r => r.Index) .ToArray(); Assert.Positive(resultsArray.Length); Assert.IsTrue(resultsArray.All(r => r.Valid)); for (int i = 1; i < resultsArray.Length; i++) { if (resultsArray[i].First - 1 != resultsArray[i - 1].Last) { Assert.Fail("Bad ordering detected"); } } Assert.AreEqual(expectPayloadCount - 1, resultsArray[^ 1].Last);
private Transaction MapResponse <T>(T builder, string rawResponse) where T : TransactionBuilder <Transaction> { var root = ElementTree.Parse(rawResponse).Get(MapRequestType(builder) + "Response"); // check response string errorCode = root.GetValue <string>("ErrorCode"); string errorMessage = root.GetValue <string>("ErrorMessage"); if (!string.IsNullOrEmpty(errorMessage)) { throw new GatewayException( string.Format("Unexpected Gateway Response: {0} - {1}", errorCode, errorMessage), errorCode, errorMessage ); } var response = new Transaction { ResponseCode = "00", ResponseMessage = root.GetValue <string>("ApprovalStatus"), TransactionId = root.GetValue <string>("Token"), AuthorizationCode = root.GetValue <string>("AuthorizationCode"), HostResponseDate = root.GetValue <DateTime>("TransactionDate"), AuthorizedAmount = root.GetValue <string>("Amount").ToAmount(), AvailableBalance = root.GetValue <string>("RemainingCardBalance")?.ToAmount(), //MaskedCardNumber = root.GetValue<string>("CardNumber"), //CardHolder CardType = root.GetValue <string>("CardType"), //FsaCard //ReaderEntryMode AvsResponseCode = root.GetValue <string>("AvsResponse"), CvnResponseCode = root.GetValue <string>("CvResponse"), //ExtraData //FraudScoring //DebitTraceNumber //Rfmiq //Invoice Token = root.GetValue <string>("VaultToken") }; if (root.Has("BatchStatus")) { var summary = new BatchSummary { Status = root.GetValue <string>("BatchStatus"), TotalAmount = root.GetValue <decimal>("BatchAmount"), TransactionCount = root.GetValue <int>("TransactionCount") }; response.BatchSummary = summary; } return(response); }
private static void ValidateBatchSummary(Batch batch) { BatchSummary batchSummary = batch.Summary; Assert.NotNull(batchSummary); Assert.Equal(batch.Id, batchSummary.Id); Assert.Equal(batch.ResultSets.Count, batchSummary.ResultSetSummaries.Length); Assert.Equal(batch.Selection, batchSummary.Selection); Assert.Equal(batch.HasError, batchSummary.HasError); // Something other than default date is provided for start and end times Assert.True(DateTime.Parse(batchSummary.ExecutionStart) > default(DateTime)); Assert.True(DateTime.Parse(batchSummary.ExecutionEnd) > default(DateTime)); Assert.NotNull(batchSummary.ExecutionElapsed); }
public void Test_000_Settlement() { Logger.AppendText("Authorization End Date/Time: {0}", DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss")); Logger.AppendText("First HRN: {0}", _firstTransactionId); Logger.AppendText("Last HRN: {0}", _lastTransactionId); Logger.AppendText("\r\nTest_000_Settlement"); Logger.AppendText("Settlement Time: {0}", DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss")); BatchSummary response = BatchService.CloseBatch(); Assert.IsNotNull(response); Assert.AreEqual("00", response.ResponseCode); //_logger.AppendText("Batch Number: {0}", response.BatchId); }
public void Test_240_batchClose_EndOfShift() { configName = "default"; CreditSale(100); CreditSale(100); CreditSale(10); DebitSale(10); DebitSale(10); DebitSale(1); BatchSummary response = BatchService.CloseBatch(BatchCloseType.EndOfShift); Assert.IsNotNull(response); Assert.IsTrue(response.IsBalanced); }
public void BatchExecuteNoResultSets() { // Setup: // ... Create a callback for batch start BatchSummary batchSummaryFromStart = null; Batch.BatchAsyncEventHandler batchStartCallback = b => { batchSummaryFromStart = b.Summary; return(Task.FromResult(0)); }; // ... Create a callback for batch completion BatchSummary batchSummaryFromCompletion = null; Batch.BatchAsyncEventHandler batchCompleteCallback = b => { batchSummaryFromCompletion = b.Summary; return(Task.FromResult(0)); }; // ... Create a callback for result completion bool resultCallbackFired = false; ResultSet.ResultSetAsyncEventHandler resultSetCallback = r => { resultCallbackFired = true; return(Task.FromResult(0)); }; // If I execute a query that should get no result sets var fileStreamFactory = Common.GetFileStreamFactory(new Dictionary <string, byte[]>()); Batch batch = new Batch(Common.StandardQuery, Common.SubsectionDocument, Common.Ordinal, fileStreamFactory); batch.BatchStart += batchStartCallback; batch.BatchCompletion += batchCompleteCallback; batch.ResultSetCompletion += resultSetCallback; batch.Execute(GetConnection(Common.CreateTestConnectionInfo(null, false)), CancellationToken.None).Wait(); // Then: // ... It should have executed without error Assert.True(batch.HasExecuted, "The query should have been marked executed."); Assert.False(batch.HasError, "The batch should not have an error"); // ... The results should be empty Assert.Empty(batch.ResultSets); Assert.Empty(batch.ResultSummaries); // ... The results should not be null Assert.NotNull(batch.ResultSets); Assert.NotNull(batch.ResultSummaries); // ... There should be a message for how many rows were affected Assert.Equal(1, batch.ResultMessages.Count()); // ... The callback for batch start should have been called // ... The info from it should have been basic Assert.NotNull(batchSummaryFromStart); Assert.False(batchSummaryFromStart.HasError); Assert.Equal(Common.Ordinal, batchSummaryFromStart.Id); Assert.Equal(Common.SubsectionDocument, batchSummaryFromStart.Selection); Assert.True(DateTime.Parse(batchSummaryFromStart.ExecutionStart) > default(DateTime)); Assert.Null(batchSummaryFromStart.ResultSetSummaries); Assert.Null(batchSummaryFromStart.Messages); Assert.Null(batchSummaryFromStart.ExecutionElapsed); Assert.Null(batchSummaryFromStart.ExecutionEnd); // ... The callback for batch completion should have been fired // ... The summary should match the expected info Assert.NotNull(batchSummaryFromCompletion); Assert.False(batchSummaryFromCompletion.HasError); Assert.Equal(Common.Ordinal, batchSummaryFromCompletion.Id); Assert.Equal(0, batchSummaryFromCompletion.ResultSetSummaries.Length); Assert.Equal(1, batchSummaryFromCompletion.Messages.Length); Assert.Equal(Common.SubsectionDocument, batchSummaryFromCompletion.Selection); Assert.True(DateTime.Parse(batchSummaryFromCompletion.ExecutionStart) > default(DateTime)); Assert.True(DateTime.Parse(batchSummaryFromCompletion.ExecutionEnd) > default(DateTime)); Assert.NotNull(batchSummaryFromCompletion.ExecutionElapsed); // ... The callback for the result set should NOT have been fired Assert.False(resultCallbackFired); }
public void BatchExecuteTwoResultSets() { var dataset = new[] { Common.StandardTestData, Common.StandardTestData }; int resultSets = dataset.Length; ConnectionInfo ci = Common.CreateTestConnectionInfo(dataset, false); // Setup: Create a callback for batch completion BatchSummary batchSummaryFromCallback = null; Batch.BatchAsyncEventHandler batchCallback = b => { batchSummaryFromCallback = b.Summary; return(Task.FromResult(0)); }; // ... Create a callback for resultset completion int resultSummaryCount = 0; ResultSet.ResultSetAsyncEventHandler resultSetCallback = r => { resultSummaryCount++; return(Task.FromResult(0)); }; // If I execute a query that should get two result sets var fileStreamFactory = Common.GetFileStreamFactory(new Dictionary <string, byte[]>()); Batch batch = new Batch(Common.StandardQuery, Common.SubsectionDocument, Common.Ordinal, fileStreamFactory); batch.BatchCompletion += batchCallback; batch.ResultSetCompletion += resultSetCallback; batch.Execute(GetConnection(ci), CancellationToken.None).Wait(); // Then: // ... It should have executed without error Assert.True(batch.HasExecuted, "The batch should have been marked executed."); Assert.False(batch.HasError, "The batch should not have an error"); // ... There should be exactly two result sets Assert.Equal(resultSets, batch.ResultSets.Count()); foreach (ResultSet rs in batch.ResultSets) { // ... Each result set should have 5 rows Assert.Equal(Common.StandardRows, rs.RowCount); // ... Inside each result set should be 5 columns Assert.Equal(Common.StandardColumns, rs.Columns.Length); } // ... There should be exactly two result set summaries Assert.Equal(resultSets, batch.ResultSummaries.Length); foreach (ResultSetSummary rs in batch.ResultSummaries) { // ... Inside each result summary, there should be 5 rows Assert.Equal(Common.StandardRows, rs.RowCount); // ... Inside each result summary, there should be 5 column definitions Assert.Equal(Common.StandardColumns, rs.ColumnInfo.Length); } // ... The callback for batch completion should have been fired Assert.NotNull(batchSummaryFromCallback); // ... The callback for result set completion should have been fired Assert.Equal(2, resultSummaryCount); }
/// <summary> /// 发送批次汇总 /// </summary> /// <param name="pageIndex"></param> /// <param name="stDate"></param> /// <param name="edDate"></param> /// <param name="batchId"></param> /// <param name="remark"></param> /// <param name="content"></param> /// <param name="sourceType"></param> /// <param name="channel"></param> /// <returns></returns> public Dictionary <string, object> GetBatchSummaryInfo(int pageIndex, string stDate, string edDate, string batchId, string remark, int sourceType, int channel) { Dictionary <string, object> dicData = new Dictionary <string, object>() { { "data", null }, { "count", null } }; StringBuilder strSql = new StringBuilder(); string strWhere = ""; List <BatchSummary> sumList = new List <BatchSummary>(); List <BatchSummary> reList = new List <BatchSummary>(); //页数计算 int bgNumber = ((pageIndex - 1) * 15) + 1; int edNumber = (pageIndex) * 15; strSql.Append("select * into #List from ("); strSql.Append("select *,ROW_NUMBER() over (order by id desc) rowNumber from MessageSending where 1=1 "); if (Convert.ToDateTime(edDate) > Convert.ToDateTime(stDate)) { if (stDate != "") { DateTime stTime = Convert.ToDateTime(stDate); strWhere += " and CreateTime >='" + stTime.ToString("yyyy-MM-dd") + "' "; } if (edDate != "") { DateTime edTime = Convert.ToDateTime(edDate); strWhere += " and CreateTime <'" + edTime.AddDays(1).Date.ToString("yyyy-MM-dd") + "' "; } } else if ((Convert.ToDateTime(edDate) == Convert.ToDateTime(stDate)) && Convert.ToDateTime(stDate).ToShortDateString() != DateTime.Now.ToShortDateString()) { DateTime time = Convert.ToDateTime(stDate); strWhere += " and datediff(day,CreateTime,'" + time.Date.ToString("yyyy-MM-dd") + "')=0"; } if (!string.IsNullOrEmpty(batchId)) { strWhere += " and batchId like '%" + batchId + "%' "; } if (!string.IsNullOrEmpty(remark)) { strWhere += " and Remark like '%" + remark + "%' "; } //if (!string.IsNullOrEmpty(content)) //{ // strWhere += " and Content like '%" + content + "%' "; //} //if (sourceType > 0) //{ // strWhere += " and SourceType=" + sourceType; //} if (channel > 0) { strWhere += " and ChannelSet like '%" + channel + "%' "; } strSql.Append(strWhere); strSql.Append(" ) t "); strSql.Append(" where t.rowNumber between @bgNumber and @edNumber; "); #region 处理合并Batch逻辑 StringBuilder strCondition = new StringBuilder(); strCondition.Append(strSql.ToString()); strCondition.Append("select BatchId from #List;"); List <string> batchList = DapperHelper.Query <string>(strCondition.ToString(), new { bgNumber = bgNumber, edNumber = edNumber }).ToList(); if (batchList != null && batchList.Count > 0) { foreach (var str in batchList) { sumList.Add(new BatchSummary(str)); } } else { return(null); } strCondition.Clear(); strCondition.Append(strSql.ToString()); strCondition.Append( "select bat.BatchId,ChannelId,AllowNumber,FeedBackArrive,FeedBackOpen,bat.AccIdCount,bat.CreateTime,bat.Remark from #List left join MessageBatch bat on #List.BatchId=bat.BatchId;"); List <dynamic> detailList = DapperHelper.Query <dynamic>(strCondition.ToString(), new { bgNumber = bgNumber, edNumber = edNumber }).ToList(); foreach (var item in detailList) { BatchSummary summary = sumList.Find(x => x.BatchId == item.BatchId.ToString()); summary.AccIdCount = Convert.ToInt32(item.AccIdCount); summary.CreateTime = Convert.ToDateTime(item.CreateTime); summary.SendRemark = item.Remark.ToString(); string channelId = item.ChannelId.ToString(); switch (channelId) { case "1": summary.SmsSend = Convert.ToInt32(item.AllowNumber); summary.SmsArrive = Convert.ToInt32(item.FeedBackArrive); summary.SmsOpen = Convert.ToInt32(item.FeedBackOpen); if (summary.SmsSend != 0) { summary.SmsPartition = (Convert.ToDouble(summary.SmsOpen) / summary.SmsSend * 100).ToString("F2") + "%"; } break; case "2": summary.WebSend = Convert.ToInt32(item.AllowNumber); summary.WebArrive = Convert.ToInt32(item.FeedBackArrive); summary.WebOpen = Convert.ToInt32(item.FeedBackOpen); if (summary.WebSend != 0) { summary.WebPartition = (Convert.ToDouble(summary.WebOpen) / summary.WebSend * 100).ToString("F2") + "%"; } break; case "3": summary.MobSend = Convert.ToInt32(item.AllowNumber); summary.MobArrive = Convert.ToInt32(item.FeedBackArrive); summary.MobOpen = Convert.ToInt32(item.FeedBackOpen); if (summary.MobSend != 0) { summary.MobPartition = (Convert.ToDouble(summary.MobOpen) / summary.MobSend * 100).ToString("F2") + "%"; } break; case "4": summary.EmailSend = Convert.ToInt32(item.AllowNumber); summary.EmailArrive = Convert.ToInt32(item.FeedBackArrive); summary.EmailOpen = Convert.ToInt32(item.FeedBackOpen); if (summary.EmailSend != 0) { summary.EmailPartition = (Convert.ToDouble(summary.EmailOpen) / summary.EmailSend * 100).ToString("F2") + "%"; } break; } reList.Add(summary); } #endregion dicData["data"] = reList.Distinct(); dicData["count"] = GetSendingCount(strWhere); return(dicData); }
internal override void MapResponse(Element response) { category = response.GetValue <string>("TableCategory"); if (category != null) { if (category.Equals("BATCH DETAIL", StringComparison.OrdinalIgnoreCase) || category.Equals("BATCH SUMMARY", StringComparison.OrdinalIgnoreCase)) { base.MapResponse(response); if (BatchSummary == null) { BatchSummary = new BatchSummary(); } BatchSummary.MerchantName = fieldValues.GetValue <string>("MerchantName"); BatchSummary.SiteId = fieldValues.GetValue <string>("SiteId"); BatchSummary.DeviceId = fieldValues.GetValue <string>("DeviceId"); BatchSummary.Id = fieldValues.GetValue <int>("BatchId"); BatchSummary.SequenceNumber = fieldValues.GetValue <string>("BatchSeqNbr"); BatchSummary.Status = fieldValues.GetValue <string>("BatchStatus"); BatchSummary.OpenTime = fieldValues.GetValue <string>("OpenUtcDT").ToDateTime(); BatchSummary.OpenTransactionId = fieldValues.GetValue <string>("OpenTxnId"); BatchSummary.CloseTransactionId = fieldValues.GetValue <string>("CloseTxnId"); BatchSummary.CloseCount = fieldValues.GetValue <int>("BatchTxnCnt"); BatchSummary.TotalAmount = fieldValues.GetAmount("BatchTxnAmt"); BatchSummary.CreditCount = fieldValues.GetValue <int>("CreditCnt"); BatchSummary.CreditAmount = fieldValues.GetAmount("CreditAmt"); BatchSummary.DebitCount = fieldValues.GetValue <int>("DebitCnt"); BatchSummary.DebitAmount = fieldValues.GetAmount("DebitAmt"); BatchSummary.SaleCount = fieldValues.GetValue <int>("SaleCnt"); BatchSummary.SaleAmount = fieldValues.GetAmount("SaleAmt"); BatchSummary.ReturnCount = fieldValues.GetValue <int>("ReturnCtn"); BatchSummary.ReturnAmount = fieldValues.GetAmount("ReturnAmt"); } if (category.Equals("VISA CARD SUMMARY", StringComparison.OrdinalIgnoreCase) || category.Equals("MASTERCARD CARD SUMMARY", StringComparison.OrdinalIgnoreCase) || category.Equals("AMERICAN EXPRESS CARD SUMMARY", StringComparison.OrdinalIgnoreCase) || category.Equals("DISCOVER CARD SUMMARY", StringComparison.OrdinalIgnoreCase) || category.Equals("PAYPAL CARD SUMMARY", StringComparison.OrdinalIgnoreCase)) { try { CardBrandSummary brandSummary = new CardBrandSummary(Encoding.UTF8.GetBytes(currentMessage), "GetBatchReport"); if (category.Equals("VISA CARD SUMMARY")) { VisaSummary = brandSummary; } if (category.Equals("MASTERCARD CARD SUMMARY")) { MasterCardSummary = brandSummary; } if (category.Equals("AMERICAN EXPRESS CARD SUMMARY")) { AmexSummary = brandSummary; } if (category.Equals("DISCOVERY CARD SUMMARY")) { DiscoverSummary = brandSummary; } if (category.Equals("PAYPAL CARD SUMMARY")) { PaypalSummary = brandSummary; } } catch (ApiException exc) {} } if (category.StartsWith("TRANSACTION", StringComparison.OrdinalIgnoreCase)) { base.MapResponse(response); TransactionSummary summary = new TransactionSummary(); if (category.Equals(lastCategory, StringComparison.OrdinalIgnoreCase)) { summary = _lastTransactionSummary; } summary.ReferenceNumber = fieldValues.GetValue <string>("ReferenceNumber"); summary.TransactionDate = fieldValues.GetValue <string>("TransactionTime").ToDateTime(); summary.TransactionStatus = fieldValues.GetValue <string>("TransactionStatus"); summary.MaskedCardNumber = fieldValues.GetValue <string>("MaskedPAN"); summary.CardType = fieldValues.GetValue <string>("CardType"); summary.TransactionType = fieldValues.GetValue <string>("TransactionType"); summary.CardEntryMethod = fieldValues.GetValue <string>("CardAcquisition"); summary.AuthCode = fieldValues.GetValue <string>("ApprovalCode"); summary.GatewayResponseCode = fieldValues.GetValue <string>("Responsecode"); summary.GatewayResponseMessage = fieldValues.GetValue <string>("ResponseText"); summary.CashBackAmount = fieldValues.GetAmount("CashbackAmount"); summary.GratuityAmount = fieldValues.GetAmount("TipAmount"); summary.AuthorizedAmount = fieldValues.GetAmount("AuthorizedAmount"); summary.SettlementAmount = fieldValues.GetAmount("SettleAmount"); summary.Amount = fieldValues.GetAmount("RequestedAmount"); if (!category.Equals(lastCategory, StringComparison.OrdinalIgnoreCase)) { if (TransactionSummaries == null) { TransactionSummaries = new List <TransactionSummary>(); } TransactionSummaries.Add(summary); } _lastTransactionSummary = summary; } lastCategory = category; } }