From 5c351af0a909ec8ed4438665831dea92ccc90623 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Tue, 10 Oct 2023 21:40:34 +0100 Subject: [PATCH 1/2] Added Pending figures to Todays Settlement --- .../ReportingManager.cs | 57 ++++++------ .../TodaysSettlement.cs | 4 + .../DatabaseHelper.cs | 89 +++++++++++++------ .../FactSettlementsControllerTests.cs | 77 +++++----------- EstateReportingAPI.Models/TodaysSettlement.cs | 4 + .../Controllers/FactSettlementController.cs | 7 +- 6 files changed, 128 insertions(+), 110 deletions(-) diff --git a/EstateReportingAPI.BusinessLogic/ReportingManager.cs b/EstateReportingAPI.BusinessLogic/ReportingManager.cs index 67bf879..e3f49e0 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManager.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManager.cs @@ -96,6 +96,7 @@ on settlement.SettlementReportingId equals merchantSettlementFee.SettlementRepor join transaction in context.Transactions on merchantSettlementFee.TransactionReportingId equals transaction.TransactionReportingId where settlement.SettlementDate == settlementDate + && merchantSettlementFee.IsSettled group new { settlement.SettlementDate, @@ -295,33 +296,39 @@ on today.Hour equals comparison.Hour public async Task GetTodaysSettlement(Guid estateId, DateTime comparisonDate, CancellationToken cancellationToken){ EstateManagementGenericContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken); - // First we need to get a value of todays sales - Decimal todaysSettlementValue = (from s in context.Settlements - join f in context.MerchantSettlementFees on s.SettlementReportingId equals f.SettlementReportingId - where f.IsSettled && s.SettlementDate == DateTime.Now.Date - select f.CalculatedValue).Sum(); - - Int32 todaysSettlementCount = (from s in context.Settlements - join f in context.MerchantSettlementFees on s.SettlementReportingId equals f.SettlementReportingId - where f.IsSettled && s.SettlementDate == DateTime.Now.Date - select f.CalculatedValue).Count(); - - Decimal comparisonSettlementValue = (from s in context.Settlements - join f in context.MerchantSettlementFees on s.SettlementReportingId equals f.SettlementReportingId - where f.IsSettled && s.SettlementDate == comparisonDate - select f.CalculatedValue).Sum(); - - Int32 comparisonSettlementCount = (from s in context.Settlements - join f in context.MerchantSettlementFees on s.SettlementReportingId equals f.SettlementReportingId - where f.IsSettled && s.SettlementDate == comparisonDate - select f.CalculatedValue).Count(); + var todaySettlementData = (from s in context.Settlements + join f in context.MerchantSettlementFees on s.SettlementReportingId equals f.SettlementReportingId + where s.SettlementDate == DateTime.Now.Date + group f by f.IsSettled into grouped + select new + { + IsSettled = grouped.Key, + CalculatedValueSum = grouped.Sum(item => item.CalculatedValue), + CalculatedValueCount = grouped.Count() + }).ToList(); + + var comparisonSettlementData = (from s in context.Settlements + join f in context.MerchantSettlementFees on s.SettlementReportingId equals f.SettlementReportingId + where s.SettlementDate == comparisonDate + group f by f.IsSettled into grouped + select new + { + IsSettled = grouped.Key, + CalculatedValueSum = grouped.Sum(item => item.CalculatedValue), + CalculatedValueCount = grouped.Count() + }).ToList(); + TodaysSettlement response = new TodaysSettlement{ - ComparisonSettlementCount = comparisonSettlementCount, - ComparisonSettlementValue = comparisonSettlementValue, - TodaysSettlementCount = todaysSettlementCount, - TodaysSettlementValue = todaysSettlementValue - }; + ComparisonSettlementCount = comparisonSettlementData.FirstOrDefault(x => x.IsSettled)?.CalculatedValueCount ?? 0, + ComparisonSettlementValue = comparisonSettlementData.FirstOrDefault(x => x.IsSettled)?.CalculatedValueSum ?? 0, + ComparisonPendingSettlementCount = comparisonSettlementData.FirstOrDefault(x => x.IsSettled == false)?.CalculatedValueCount ?? 0, + ComparisonPendingSettlementValue = comparisonSettlementData.FirstOrDefault(x => x.IsSettled == false)?.CalculatedValueSum ?? 0, + TodaysSettlementCount = todaySettlementData.FirstOrDefault(x => x.IsSettled)?.CalculatedValueCount ?? 0, + TodaysSettlementValue = todaySettlementData.FirstOrDefault(x => x.IsSettled)?.CalculatedValueSum ?? 0, + TodaysPendingSettlementCount = todaySettlementData.FirstOrDefault(x => x.IsSettled == false)?.CalculatedValueCount ?? 0, + TodaysPendingSettlementValue = todaySettlementData.FirstOrDefault(x => x.IsSettled == false)?.CalculatedValueSum ?? 0 + }; return response; } diff --git a/EstateReportingAPI.DataTrasferObjects/TodaysSettlement.cs b/EstateReportingAPI.DataTrasferObjects/TodaysSettlement.cs index 66f0b52..a2b87cd 100644 --- a/EstateReportingAPI.DataTrasferObjects/TodaysSettlement.cs +++ b/EstateReportingAPI.DataTrasferObjects/TodaysSettlement.cs @@ -4,8 +4,12 @@ public class TodaysSettlement { public Decimal TodaysSettlementValue { get; set; } + public Decimal TodaysPendingSettlementValue { get; set; } public Int32 TodaysSettlementCount { get; set; } + public Int32 TodaysPendingSettlementCount { get; set; } public Decimal ComparisonSettlementValue { get; set; } + public Decimal ComparisonPendingSettlementValue { get; set; } public Int32 ComparisonSettlementCount { get; set; } + public Int32 ComparisonPendingSettlementCount { get; set; } } } \ No newline at end of file diff --git a/EstateReportingAPI.IntegrationTests/DatabaseHelper.cs b/EstateReportingAPI.IntegrationTests/DatabaseHelper.cs index b0f4217..42db441 100644 --- a/EstateReportingAPI.IntegrationTests/DatabaseHelper.cs +++ b/EstateReportingAPI.IntegrationTests/DatabaseHelper.cs @@ -37,24 +37,26 @@ public List GetDatesForYear(Int32 year){ DateTime startDate = new DateTime(year, 1, 1); DateTime endDate = new DateTime(year, 12, 31); - for (DateTime currentDate = startDate; currentDate <= endDate; currentDate = currentDate.AddDays(1)) - { + for (DateTime currentDate = startDate; currentDate <= endDate; currentDate = currentDate.AddDays(1)){ datesInYear.Add(currentDate); } + return datesInYear; } - public async Task AddSettlementRecordWithFees(DateTime dateTime, Int32 estateReportingId, Int32 merchantReportingId, - List<(Decimal feeValue, Decimal calulatedValue, Int32 transactionFeeReportingId)> feesList){ + public async Task AddSettlementRecordWithFees(DateTime dateTime, + Int32 estateReportingId, + Int32 merchantReportingId, + List<(Decimal feeValue, Decimal calulatedValue, Int32 transactionFeeReportingId, Boolean isSettled)> feesList){ Settlement settlementRecord = new Settlement{ - ProcessingStarted = true, - IsCompleted = true, - EstateReportingId = estateReportingId, - MerchantReportingId = merchantReportingId, - ProcessingStartedDateTIme = dateTime, - SettlementDate = dateTime, - SettlementId = Guid.NewGuid(), - }; + ProcessingStarted = true, + IsCompleted = true, + EstateReportingId = estateReportingId, + MerchantReportingId = merchantReportingId, + ProcessingStartedDateTIme = dateTime, + SettlementDate = dateTime, + SettlementId = Guid.NewGuid(), + }; await this.Context.Settlements.AddAsync(settlementRecord, CancellationToken.None); await this.Context.SaveChangesAsync(CancellationToken.None); @@ -62,11 +64,11 @@ public async Task AddSettlementRecordWithFees(DateTime dateTime, Int32 estateRep var settlement = await this.Context.Settlements.Where(s => s.SettlementId == settlementRecord.SettlementId).SingleAsync(CancellationToken.None); Int32 counter = 1; - foreach ((Decimal feeValue, Decimal calulatedValue, Int32 transactionFeeReportingId) fee in feesList){ + foreach ((Decimal feeValue, Decimal calulatedValue, Int32 transactionFeeReportingId, Boolean isSettled) fee in feesList){ MerchantSettlementFee merchantSettlementFee = new MerchantSettlementFee{ MerchantReportingId = merchantReportingId, SettlementReportingId = settlement.SettlementReportingId, - IsSettled = true, + IsSettled = fee.isSettled, FeeCalculatedDateTime = dateTime, TransactionReportingId = counter, TransactionFeeReportingId = fee.transactionFeeReportingId, @@ -80,8 +82,12 @@ public async Task AddSettlementRecordWithFees(DateTime dateTime, Int32 estateRep await this.Context.SaveChangesAsync(CancellationToken.None); } - public async Task AddTransaction(DateTime dateTime, Int32 merchantReportingId,String operatorIdentifier, Int32 contractProductReportingId, - String responseCode, Decimal transactionAmount){ + public async Task AddTransaction(DateTime dateTime, + Int32 merchantReportingId, + String operatorIdentifier, + Int32 contractProductReportingId, + String responseCode, + Decimal transactionAmount){ Transaction transaction = new Transaction{ MerchantReportingId = merchantReportingId, @@ -105,7 +111,7 @@ public async Task AddTransaction(DateTime dateTime, Int32 merchantR return transaction; } - public async Task AddMerchant(Int32 estateReportingId, String merchantName, DateTime lastSaleDateTime, List<(String addressLine1,String town,String postCode, String region)> addressList = null){ + public async Task AddMerchant(Int32 estateReportingId, String merchantName, DateTime lastSaleDateTime, List<(String addressLine1, String town, String postCode, String region)> addressList = null){ Merchant merchant = new Merchant{ EstateReportingId = estateReportingId, MerchantId = Guid.NewGuid(), @@ -113,7 +119,7 @@ public async Task AddMerchant(Int32 estateReportingId, String merchantName, Date LastSaleDate = lastSaleDateTime.Date, LastSaleDateTime = lastSaleDateTime }; - + await this.Context.Merchants.AddAsync(merchant); await this.Context.SaveChangesAsync(CancellationToken.None); @@ -123,17 +129,16 @@ public async Task AddMerchant(Int32 estateReportingId, String merchantName, Date if (savedMerchant == null){ throw new Exception($"Error saving merchant {merchant.Name}"); } - foreach ((String addressLine1, String town, String postCode, String region) address in addressList) - { - await this.Context.MerchantAddresses.AddAsync(new MerchantAddress - { - AddressId = Guid.NewGuid(), - AddressLine1 = address.addressLine1, - Region = address.region, - Town = address.town, - PostalCode = address.postCode, - MerchantReportingId = savedMerchant.MerchantReportingId - }); + + foreach ((String addressLine1, String town, String postCode, String region) address in addressList){ + await this.Context.MerchantAddresses.AddAsync(new MerchantAddress{ + AddressId = Guid.NewGuid(), + AddressLine1 = address.addressLine1, + Region = address.region, + Town = address.town, + PostalCode = address.postCode, + MerchantReportingId = savedMerchant.MerchantReportingId + }); } } @@ -166,4 +171,30 @@ public async Task AddEstateOperator(String operatorIdentifier){ await this.Context.SaveChangesAsync(CancellationToken.None); } + + public async Task<(Decimal settledTransactionsValue, Decimal pendingSettlementTransactionsValue, Decimal settlementFeesValue, Decimal pendingSettlementFeesValue)> AddSettlementRecord(DateTime settlementDate, Int32 estateReportingId, Int32 merchantReportingId, Int32 settledTransactionCount, Int32 pendingSettlementTransactionCount){ + List settledTransactions = new(); + List pendingSettlementTransactions = new(); + List<(Decimal feeValue, Decimal calulatedValue, Int32 transactionFeeReportingId, Boolean isSettled)> settlementFees = new(); + List<(Decimal feeValue, Decimal calulatedValue, Int32 transactionFeeReportingId, Boolean isSettled)> pendingSettlementFees = new(); + + for (int i = 1; i <= settledTransactionCount; i++){ + Transaction transaction = await this.AddTransaction(settlementDate, 1, "Safaricom", 1, "0000", i); + settledTransactions.Add(transaction); + settlementFees.Add((0.5m, 0.5m * i, i, true)); + } + + await this.AddSettlementRecordWithFees(settlementDate, 1, 1, settlementFees); + + for (int i = 1; i <= pendingSettlementTransactionCount; i++){ + Transaction transaction = await this.AddTransaction(DateTime.Now, 1, "Safaricom", 1, "0000", i); + pendingSettlementTransactions.Add(transaction); + pendingSettlementFees.Add((0.5m, 0.5m * i, i, false)); + } + + await this.AddSettlementRecordWithFees(settlementDate, 1, 1, pendingSettlementFees); + + return (settledTransactions.Sum(s => s.TransactionAmount), pendingSettlementTransactions.Sum(p => p.TransactionAmount), + settlementFees.Sum(s => s.calulatedValue), pendingSettlementFees.Sum(p => p.calulatedValue)); + } } \ No newline at end of file diff --git a/EstateReportingAPI.IntegrationTests/FactSettlementsControllerTests.cs b/EstateReportingAPI.IntegrationTests/FactSettlementsControllerTests.cs index 62547e6..796caa3 100644 --- a/EstateReportingAPI.IntegrationTests/FactSettlementsControllerTests.cs +++ b/EstateReportingAPI.IntegrationTests/FactSettlementsControllerTests.cs @@ -9,50 +9,32 @@ public class FactSettlementsControllerTests : ControllerTestsBase, IDisposable { - //public void Dispose() - //{ - // EstateManagementGenericContext context = new EstateManagementSqlServerContext(GetLocalConnectionString($"EstateReportingReadModel{this.TestId.ToString()}")); - - // Console.WriteLine($"About to delete database EstateReportingReadModel{this.TestId.ToString()}"); - // Boolean result = context.Database.EnsureDeleted(); - // Console.WriteLine($"Delete result is {result}"); - // result.ShouldBeTrue(); - //} - [Fact] public async Task FactSettlementsController_TodaysSettlement_SettlementReturned(){ EstateManagementGenericContext context = new EstateManagementSqlServerContext(GetLocalConnectionString($"EstateReportingReadModel{this.TestId.ToString()}")); DatabaseHelper helper = new DatabaseHelper(context); - List<(Decimal feeValue, Decimal calulatedValue, Int32 transactionFeeReportingId)> todaysSettlementFees = new(); - Int32 todaysSettlementTransactionCount = 15; - for (int i = 1; i <= todaysSettlementTransactionCount; i++){ - todaysSettlementFees.Add((0.5m, 0.5m * i, i)); - } - - await helper.AddSettlementRecordWithFees(DateTime.Now, 1, 1, todaysSettlementFees); - - List<(Decimal feeValue, Decimal calulatedValue, Int32 transactionFeeReportingId)> comparisonDateSettlementFees = new(); - - Int32 comparisonDateSettlementTransactionCount = 9; - for (int i = 1; i <= comparisonDateSettlementTransactionCount; i++) - { - comparisonDateSettlementFees.Add((0.5m, 0.5m * i, i)); - } + Int32 todaysPendingSettlementTransactionCount = 9; + var todayTotals = await helper.AddSettlementRecord(DateTime.Now, 1, 1, todaysSettlementTransactionCount, todaysPendingSettlementTransactionCount); - DateTime comparisonDate = DateTime.Now.AddDays(-1); - await helper.AddSettlementRecordWithFees(comparisonDate, 1, 1, comparisonDateSettlementFees); + Int32 comparisonSettlementTransactionCount = 15; + Int32 comparisonPendingSettlementTransactionCount = 9; + var comparisonTotals = await helper.AddSettlementRecord(DateTime.Now.AddDays(-1), 1, 1, todaysSettlementTransactionCount, todaysPendingSettlementTransactionCount); - HttpResponseMessage response = await this.CreateAndSendHttpRequestMessage($"api/facts/settlements/todayssettlement?comparisonDate={comparisonDate.ToString("yyyy-MM-dd")}"); + HttpResponseMessage response = await this.CreateAndSendHttpRequestMessage($"api/facts/settlements/todayssettlement?comparisonDate={DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")}"); String content = await response.Content.ReadAsStringAsync(CancellationToken.None); TodaysSettlement? todaysSettlement = JsonConvert.DeserializeObject(content); - todaysSettlement.ComparisonSettlementCount.ShouldBe(comparisonDateSettlementTransactionCount); - todaysSettlement.ComparisonSettlementValue.ShouldBe(comparisonDateSettlementFees.Sum(c => c.calulatedValue)); - + todaysSettlement.ComparisonSettlementCount.ShouldBe(comparisonSettlementTransactionCount); + todaysSettlement.ComparisonSettlementValue.ShouldBe(comparisonTotals.settlementFeesValue); + todaysSettlement.ComparisonPendingSettlementCount.ShouldBe(comparisonPendingSettlementTransactionCount); + todaysSettlement.ComparisonPendingSettlementValue.ShouldBe(comparisonTotals.pendingSettlementFeesValue); + todaysSettlement.TodaysSettlementCount.ShouldBe(todaysSettlementTransactionCount); - todaysSettlement.TodaysSettlementValue.ShouldBe(todaysSettlementFees.Sum(c => c.calulatedValue)); + todaysSettlement.TodaysSettlementValue.ShouldBe(todayTotals.settlementFeesValue); + todaysSettlement.TodaysPendingSettlementCount.ShouldBe(todaysPendingSettlementTransactionCount); + todaysSettlement.TodaysPendingSettlementValue.ShouldBe(todayTotals.pendingSettlementFeesValue); } [Fact] @@ -61,38 +43,23 @@ public async Task FactSettlementsController_LastSettlement_SettlementReturned() EstateManagementGenericContext context = new EstateManagementSqlServerContext(GetLocalConnectionString($"EstateReportingReadModel{this.TestId.ToString()}")); DatabaseHelper helper = new DatabaseHelper(context); - List<(Decimal feeValue, Decimal calulatedValue, Int32 transactionFeeReportingId)> todaysSettlementFees = new(); - List todaysSettlementTransactions = new(); - List yeterdaysSettlementTransactions = new(); + Int32 todaysSettlementTransactionCount = 15; - for (int i = 1; i <= todaysSettlementTransactionCount; i++){ - var transaction = await helper.AddTransaction(DateTime.Now, 1, "Safaricom", 1, "0000", i); - todaysSettlementTransactions.Add(transaction); - todaysSettlementFees.Add((0.5m, 0.5m * i, i)); - } - await helper.AddSettlementRecordWithFees(DateTime.Now, 1, 1, todaysSettlementFees); + Int32 todaysPendingSettlementTransactionCount = 9; + var todayTotals = await helper.AddSettlementRecord(DateTime.Now, 1, 1, todaysSettlementTransactionCount, todaysPendingSettlementTransactionCount); - List<(Decimal feeValue, Decimal calulatedValue, Int32 transactionFeeReportingId)> yesterdaysSettlementFees = new(); - - DateTime comparisonDate = DateTime.Now.AddDays(-1); - Int32 yesterdaysSettlementTransactionCount = 9; - for (int i = 1; i <= yesterdaysSettlementTransactionCount; i++) - { - var transaction = await helper.AddTransaction(comparisonDate, 1, "Safaricom", 1, "0000", i); - yeterdaysSettlementTransactions.Add(transaction); - yesterdaysSettlementFees.Add((0.5m, 0.5m * i, i)); - } - - await helper.AddSettlementRecordWithFees(comparisonDate, 1, 1, yesterdaysSettlementFees); + Int32 comparisonSettlementTransactionCount = 15; + Int32 comparisonPendingSettlementTransactionCount = 9; + var comparisonTotals = await helper.AddSettlementRecord(DateTime.Now.AddDays(-1), 1, 1, todaysSettlementTransactionCount, todaysPendingSettlementTransactionCount); HttpResponseMessage response = await this.CreateAndSendHttpRequestMessage($"api/facts/settlements/lastsettlement"); response.IsSuccessStatusCode.ShouldBeTrue(); String content = await response.Content.ReadAsStringAsync(CancellationToken.None); var lastSettlement = JsonConvert.DeserializeObject(content); - lastSettlement.FeesValue.ShouldBe(todaysSettlementFees.Sum(f => f.calulatedValue)); + lastSettlement.FeesValue.ShouldBe(todayTotals.settlementFeesValue); lastSettlement.SalesCount.ShouldBe(todaysSettlementTransactionCount); - lastSettlement.SalesValue.ShouldBe(todaysSettlementTransactions.Sum(t => t.TransactionAmount)); + lastSettlement.SalesValue.ShouldBe(todayTotals.settledTransactionsValue); } } } diff --git a/EstateReportingAPI.Models/TodaysSettlement.cs b/EstateReportingAPI.Models/TodaysSettlement.cs index 539d38d..7a2ba39 100644 --- a/EstateReportingAPI.Models/TodaysSettlement.cs +++ b/EstateReportingAPI.Models/TodaysSettlement.cs @@ -3,7 +3,11 @@ public class TodaysSettlement { public Decimal TodaysSettlementValue { get; set; } + public Decimal TodaysPendingSettlementValue { get; set; } public Int32 TodaysSettlementCount { get; set; } + public Int32 TodaysPendingSettlementCount { get; set; } public Decimal ComparisonSettlementValue { get; set; } + public Decimal ComparisonPendingSettlementValue { get; set; } public Int32 ComparisonSettlementCount { get; set; } + public Int32 ComparisonPendingSettlementCount { get; set; } } \ No newline at end of file diff --git a/EstateReportingAPI/Controllers/FactSettlementController.cs b/EstateReportingAPI/Controllers/FactSettlementController.cs index 82e4081..80358d9 100644 --- a/EstateReportingAPI/Controllers/FactSettlementController.cs +++ b/EstateReportingAPI/Controllers/FactSettlementController.cs @@ -42,8 +42,13 @@ public async Task TodaysSettlement([FromHeader] Guid estateId, [F TodaysSettlement response = new TodaysSettlement{ ComparisonSettlementCount = model.ComparisonSettlementCount, ComparisonSettlementValue = model.ComparisonSettlementValue, + ComparisonPendingSettlementCount = model.ComparisonPendingSettlementCount, + ComparisonPendingSettlementValue = model.ComparisonPendingSettlementValue, + TodaysSettlementCount = model.TodaysSettlementCount, - TodaysSettlementValue = model.TodaysSettlementValue + TodaysSettlementValue = model.TodaysSettlementValue, + TodaysPendingSettlementCount = model.TodaysPendingSettlementCount, + TodaysPendingSettlementValue = model.TodaysPendingSettlementValue }; return this.Ok(response); From 7ef3948c88c2068a7348ad0184de01a09f1a8bd4 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Tue, 10 Oct 2023 21:44:46 +0100 Subject: [PATCH 2/2] Add missing client methods --- .../EstateReportingApiClient.cs | 171 +++++++++++------- .../IEstateReportingApiClient.cs | 3 +- 2 files changed, 110 insertions(+), 64 deletions(-) diff --git a/EstateReportingAPI.Client/EstateReportingApiClient.cs b/EstateReportingAPI.Client/EstateReportingApiClient.cs index b7aa1fc..70d9b55 100644 --- a/EstateReportingAPI.Client/EstateReportingApiClient.cs +++ b/EstateReportingAPI.Client/EstateReportingApiClient.cs @@ -40,7 +40,7 @@ public async Task> GetCalendarDates(String accessToken, Guid HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); request.Headers.Add("EstateId", estateId.ToString()); - + // Make the Http Call here HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); @@ -118,10 +118,10 @@ public async Task> GetComparisonDates(String accessToken, G return response; } - public async Task GetTodaysSales(String accessToken, Guid estateId, DateTime comparisonDate, CancellationToken cancellationToken){ - TodaysSales response = null; + public async Task GetLastSettlement(String accessToken, Guid estateId, CancellationToken cancellationToken){ + LastSettlement response = null; - String requestUri = this.BuildRequestUrl($"/api/facts/transactions/todayssales?comparisonDate={comparisonDate.Date:yyyy-MM-dd}"); + String requestUri = this.BuildRequestUrl("/api/facts/settlements/lastsettlement"); try{ HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri); @@ -135,26 +135,24 @@ public async Task GetTodaysSales(String accessToken, Guid estateId, String content = await this.HandleResponse(httpResponse, cancellationToken); // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject(content); + response = JsonConvert.DeserializeObject(content); } catch(Exception ex){ // An exception has occurred, add some additional information to the message - Exception exception = new Exception($"Error getting todays sales for estate {estateId}.", ex); + Exception exception = new Exception($"Error getting last settlement for estate {estateId}.", ex); throw exception; } return response; } - - public async Task GetTodaysFailedSales(String accessToken, Guid estateId, String responseCode, DateTime comparisonDate, CancellationToken cancellationToken) - { - TodaysSales response = null; - String requestUri = this.BuildRequestUrl($"/api/facts/transactions/todaysfailedsales?comparisonDate={comparisonDate.Date:yyyy-MM-dd}&responseCode={responseCode}"); + public async Task GetMerchantKpi(String accessToken, Guid estateId, CancellationToken cancellationToken){ + MerchantKpi response = null; + + String requestUri = this.BuildRequestUrl("/api/facts/transactions/merchantkpis"); - try - { + try{ HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); request.Headers.Add("EstateId", estateId.ToString()); @@ -166,12 +164,11 @@ public async Task GetTodaysFailedSales(String accessToken, Guid est String content = await this.HandleResponse(httpResponse, cancellationToken); // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject(content); + response = JsonConvert.DeserializeObject(content); } - catch (Exception ex) - { + catch(Exception ex){ // An exception has occurred, add some additional information to the message - Exception exception = new Exception($"Error getting todays failed sales for estate {estateId} and response code {responseCode}.", ex); + Exception exception = new Exception($"Error getting merchant kpis for estate {estateId}.", ex); throw exception; } @@ -179,13 +176,12 @@ public async Task GetTodaysFailedSales(String accessToken, Guid est return response; } - public async Task> GetTopBottomOperatorData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken){ - List response = null; + public async Task> GetMerchants(String accessToken, Guid estateId, CancellationToken cancellationToken){ + List response = null; - String requestUri = this.BuildRequestUrl($"/api/facts/transactions/operators/topbottombyvalue?topOrBottom={(Int32)topBottom}&count={resultCount}"); + String requestUri = this.BuildRequestUrl("/api/dimensions/merchants"); - try - { + try{ HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); request.Headers.Add("EstateId", estateId.ToString()); @@ -197,12 +193,11 @@ public async Task> GetTopBottomOperatorData(String a String content = await this.HandleResponse(httpResponse, cancellationToken); // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + response = JsonConvert.DeserializeObject>(content); } - catch (Exception ex) - { + catch(Exception ex){ // An exception has occurred, add some additional information to the message - Exception exception = new Exception($"Error getting top/bottom sales by operator for estate {estateId} TopOrBottom {topBottom} ans count {resultCount}.", ex); + Exception exception = new Exception($"Error getting merchants for estate {estateId}.", ex); throw exception; } @@ -210,13 +205,12 @@ public async Task> GetTopBottomOperatorData(String a return response; } - public async Task> GetTopBottomMerchantData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken){ - List response = null; + public async Task> GetOperators(String accessToken, Guid estateId, CancellationToken cancellationToken){ + List response = null; - String requestUri = this.BuildRequestUrl($"/api/facts/transactions/merchants/topbottombyvalue?topOrBottom={(Int32)topBottom}&count={resultCount}"); + String requestUri = this.BuildRequestUrl("/api/dimensions/operators"); - try - { + try{ HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); request.Headers.Add("EstateId", estateId.ToString()); @@ -228,12 +222,11 @@ public async Task> GetTopBottomMerchantData(String a String content = await this.HandleResponse(httpResponse, cancellationToken); // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + response = JsonConvert.DeserializeObject>(content); } - catch (Exception ex) - { + catch(Exception ex){ // An exception has occurred, add some additional information to the message - Exception exception = new Exception($"Error getting top/bottom sales by merchant for estate {estateId} TopOrBottom {topBottom} ans count {resultCount}.", ex); + Exception exception = new Exception($"Error getting operators for estate {estateId}.", ex); throw exception; } @@ -241,13 +234,12 @@ public async Task> GetTopBottomMerchantData(String a return response; } - public async Task> GetTopBottomProductData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken){ - List response = null; + public async Task GetTodaysFailedSales(String accessToken, Guid estateId, String responseCode, DateTime comparisonDate, CancellationToken cancellationToken){ + TodaysSales response = null; - String requestUri = this.BuildRequestUrl($"/api/facts/transactions/products/topbottombyvalue?topOrBottom={(Int32)topBottom}&count={resultCount}"); + String requestUri = this.BuildRequestUrl($"/api/facts/transactions/todaysfailedsales?comparisonDate={comparisonDate.Date:yyyy-MM-dd}&responseCode={responseCode}"); - try - { + try{ HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); request.Headers.Add("EstateId", estateId.ToString()); @@ -259,12 +251,11 @@ public async Task> GetTopBottomProductData(String acc String content = await this.HandleResponse(httpResponse, cancellationToken); // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + response = JsonConvert.DeserializeObject(content); } - catch (Exception ex) - { + catch(Exception ex){ // An exception has occurred, add some additional information to the message - Exception exception = new Exception($"Error getting top/bottom sales by product for estate {estateId} TopOrBottom {topBottom} ans count {resultCount}.", ex); + Exception exception = new Exception($"Error getting todays failed sales for estate {estateId} and response code {responseCode}.", ex); throw exception; } @@ -272,13 +263,12 @@ public async Task> GetTopBottomProductData(String acc return response; } - public async Task> GetMerchants(String accessToken, Guid estateId, CancellationToken cancellationToken){ - List response = null; + public async Task GetTodaysSales(String accessToken, Guid estateId, DateTime comparisonDate, CancellationToken cancellationToken){ + TodaysSales response = null; - String requestUri = this.BuildRequestUrl("/api/dimensions/merchants"); + String requestUri = this.BuildRequestUrl($"/api/facts/transactions/todayssales?comparisonDate={comparisonDate.Date:yyyy-MM-dd}"); - try - { + try{ HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); request.Headers.Add("EstateId", estateId.ToString()); @@ -290,12 +280,11 @@ public async Task> GetMerchants(String accessToken, Guid estateId String content = await this.HandleResponse(httpResponse, cancellationToken); // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + response = JsonConvert.DeserializeObject(content); } - catch (Exception ex) - { + catch(Exception ex){ // An exception has occurred, add some additional information to the message - Exception exception = new Exception($"Error getting merchants for estate {estateId}.", ex); + Exception exception = new Exception($"Error getting todays sales for estate {estateId}.", ex); throw exception; } @@ -390,13 +379,12 @@ public async Task GetTodaysSettlement(String accessToken, Guid return response; } - public async Task GetMerchantKpi(String accessToken, Guid estateId, CancellationToken cancellationToken){ - MerchantKpi response = null; + public async Task> GetTopBottomMerchantData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken){ + List response = null; - String requestUri = this.BuildRequestUrl($"/api/facts/transactions/merchantkpis"); + String requestUri = this.BuildRequestUrl($"/api/facts/transactions/merchants/topbottombyvalue?topOrBottom={(Int32)topBottom}&count={resultCount}"); - try - { + try{ HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); request.Headers.Add("EstateId", estateId.ToString()); @@ -408,19 +396,76 @@ public async Task GetMerchantKpi(String accessToken, Guid estateId, String content = await this.HandleResponse(httpResponse, cancellationToken); // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject(content); + response = JsonConvert.DeserializeObject>(content); } - catch (Exception ex) - { + catch(Exception ex){ // An exception has occurred, add some additional information to the message - Exception exception = new Exception($"Error getting merchant kpis for estate {estateId}.", ex); + Exception exception = new Exception($"Error getting top/bottom sales by merchant for estate {estateId} TopOrBottom {topBottom} ans count {resultCount}.", ex); + + throw exception; + } + + return response; + } + + public async Task> GetTopBottomOperatorData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken){ + List response = null; + + String requestUri = this.BuildRequestUrl($"/api/facts/transactions/operators/topbottombyvalue?topOrBottom={(Int32)topBottom}&count={resultCount}"); + + try{ + HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); + request.Headers.Add("EstateId", estateId.ToString()); + + // Make the Http Call here + HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); + + // Process the response + String content = await this.HandleResponse(httpResponse, cancellationToken); + + // call was successful so now deserialise the body to the response object + response = JsonConvert.DeserializeObject>(content); + } + catch(Exception ex){ + // An exception has occurred, add some additional information to the message + Exception exception = new Exception($"Error getting top/bottom sales by operator for estate {estateId} TopOrBottom {topBottom} ans count {resultCount}.", ex); + + throw exception; + } + + return response; + } + + public async Task> GetTopBottomProductData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken){ + List response = null; + + String requestUri = this.BuildRequestUrl($"/api/facts/transactions/products/topbottombyvalue?topOrBottom={(Int32)topBottom}&count={resultCount}"); + + try{ + HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); + request.Headers.Add("EstateId", estateId.ToString()); + + // Make the Http Call here + HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); + + // Process the response + String content = await this.HandleResponse(httpResponse, cancellationToken); + + // call was successful so now deserialise the body to the response object + response = JsonConvert.DeserializeObject>(content); + } + catch(Exception ex){ + // An exception has occurred, add some additional information to the message + Exception exception = new Exception($"Error getting top/bottom sales by product for estate {estateId} TopOrBottom {topBottom} ans count {resultCount}.", ex); throw exception; } return response; } - + private String BuildRequestUrl(String route){ String baseAddress = this.BaseAddressResolver("EstateReportingApi"); diff --git a/EstateReportingAPI.Client/IEstateReportingApiClient.cs b/EstateReportingAPI.Client/IEstateReportingApiClient.cs index 2f274cd..2911fef 100644 --- a/EstateReportingAPI.Client/IEstateReportingApiClient.cs +++ b/EstateReportingAPI.Client/IEstateReportingApiClient.cs @@ -24,7 +24,8 @@ public interface IEstateReportingApiClient{ Task> GetTopBottomMerchantData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken); Task> GetTopBottomProductData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken); Task> GetMerchants(String accessToken, Guid estateId, CancellationToken cancellationToken); - + Task> GetOperators(String accessToken, Guid estateId, CancellationToken cancellationToken); + Task GetLastSettlement(String accessToken, Guid estateId,CancellationToken cancellationToken); #endregion } } \ No newline at end of file