예제 #1
0
        public void Test_033_Settlement()
        {
            BatchSummary response = BatchService.CloseBatch();

            Assert.IsNotNull(response);
            Assert.AreEqual("00", response.ResponseCode);
        }
예제 #2
0
        public void Test_000_batch_close()
        {
            BatchSummary summary = BatchService.CloseBatch(BatchCloseType.Forced);

            Assert.IsNotNull(summary);
            Assert.IsTrue(summary.IsBalanced);
        }
예제 #3
0
        public void SettleBatch()
        {
            BatchSummary response = BatchService.CloseBatch();

            Assert.IsNotNull(response);
            Assert.AreEqual("SUCCESS", response.Status);
        }
예제 #4
0
 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);
 }
예제 #5
0
        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
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
예제 #8
0
        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);
        }
예제 #9
0
        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);
        }
예제 #10
0
        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);
        }
예제 #11
0
        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);
        }
예제 #12
0
        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);
        }
예제 #13
0
        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);
        }
예제 #14
0
        /// <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);
        }
예제 #15
0
        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;
            }
        }