From b1fb14e83512c46bc2d54c371e6e48de870a3c78 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Thu, 16 Oct 2025 06:33:27 +0100 Subject: [PATCH 1/2] refactor getproductperformance --- .../ReportingManager.cs | 40 ------------------- .../ReportingManagerExtensions.cs | 15 +++++++ .../ReportingManagerRefactored.cs | 27 +++++++++++++ 3 files changed, 42 insertions(+), 40 deletions(-) diff --git a/EstateReportingAPI.BusinessLogic/ReportingManager.cs b/EstateReportingAPI.BusinessLogic/ReportingManager.cs index 25325f0..0a317a8 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManager.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManager.cs @@ -572,46 +572,6 @@ private Decimal SafeDivide(Decimal number, Int32 divisor) return number / divisor; } - public async Task GetProductPerformance(Guid estateId, DateTime comparisonDate, List productReportingIds, CancellationToken cancellationToken) - { - using ResolvedDbContext? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString()); - await using EstateManagementContext context = resolvedContext.Context; - - // First we need to get a value of todays sales - var todaysSalesQuery = (from t in context.TodayTransactions - where t.IsAuthorised && t.TransactionType == "Sale" - && t.TransactionDate == DateTime.Now.Date - && t.TransactionTime <= DateTime.Now.TimeOfDay - select t); - - var comparisonSalesQuery = (from t in context.TransactionHistory - where t.IsAuthorised && t.TransactionType == "Sale" - && t.TransactionDate == comparisonDate - && t.TransactionTime <= DateTime.Now.TimeOfDay - select t); - - - if (productReportingIds.Any()) - { - todaysSalesQuery = todaysSalesQuery.Where(t => productReportingIds.Contains(t.ContractProductReportingId)); - comparisonSalesQuery = comparisonSalesQuery.Where(t => productReportingIds.Contains(t.ContractProductReportingId)); - } - - TodaysSales response = new TodaysSales - { - ComparisonSalesCount = comparisonSalesQuery.Count(), - ComparisonSalesValue = comparisonSalesQuery.Sum(t => t.TransactionAmount), - TodaysSalesCount = todaysSalesQuery.Count(), - TodaysSalesValue = todaysSalesQuery.Sum(t => t.TransactionAmount), - }; - response.ComparisonAverageSalesValue = - SafeDivide(response.ComparisonSalesValue, response.ComparisonSalesCount); - response.TodaysAverageSalesValue = - SafeDivide(response.TodaysSalesValue, response.TodaysSalesCount); - - return response; - } - public async Task GetOperatorPerformance(Guid estateId, DateTime comparisonDate, List operatorReportingIds, CancellationToken cancellationToken){ using ResolvedDbContext? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString()); await using EstateManagementContext context = resolvedContext.Context; diff --git a/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs b/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs index 4fc32b2..d31d033 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs @@ -21,6 +21,21 @@ public static IQueryable ApplyMerchantFilter(this IQueryable return query.Where(t => merchantReportingIds.Contains(t.MerchantReportingId)).AsQueryable(); } + public static IQueryable ApplyProductFilter(this IQueryable query, List productReportingIds) + { + if (productReportingIds == null || productReportingIds.Count == 0) + return query; + + return query.Where(t => productReportingIds.Contains(t.ContractProductReportingId)).AsQueryable(); + } + + public static IQueryable ApplyProductFilter(this IQueryable query, List productReportingIds) + { + if (merchantReportingIds == null || productReportingIds.Count == 0) + return query; + + return query.Where(t => productReportingIds.Contains(t.ContractProductReportingId)).AsQueryable(); + } public static IQueryable ApplyMerchantFilter(this IQueryable query, EstateManagementContext context, diff --git a/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs b/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs index 97bb522..a938510 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs @@ -142,6 +142,33 @@ public async Task GetMerchantPerformance(Guid estateId, DateTime co return response; } + public async Task GetProductPerformance(Guid estateId, DateTime comparisonDate, List productReportingIds, CancellationToken cancellationToken) + { + using ResolvedDbContext? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString()); + await using EstateManagementContext context = resolvedContext.Context; + + // First we need to get a value of todays sales + IQueryable todaysSalesQuery = BuildTodaySalesQuery(context); + IQueryable comparisonSalesQuery = BuildComparisonSalesQuery(context, comparisonDate); + + todaysSalesQuery = todaysSalesQuery.ApplyProductFilter(productReportingIds); + comparisonSalesQuery = comparisonSalesQuery.ApplyProductFilter(productReportingIds); + + TodaysSales response = new TodaysSales + { + ComparisonSalesCount = await comparisonSalesQuery.CountAsync(cancellationToken), + ComparisonSalesValue = await comparisonSalesQuery.SumAsync(t => t.TransactionAmount, cancellationToken), + TodaysSalesCount = await todaysSalesQuery.CountAsync(cancellationToken), + TodaysSalesValue = await todaysSalesQuery.SumAsync(t => t.TransactionAmount, cancellationToken), + }; + response.ComparisonAverageSalesValue = + SafeDivide(response.ComparisonSalesValue, response.ComparisonSalesCount); + response.TodaysAverageSalesValue = + SafeDivide(response.TodaysSalesValue, response.TodaysSalesCount); + + return response; + } + } public class DatabaseProjections { From cdcce310e58a2393309c544dec61b356c0deba5f Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Thu, 16 Oct 2025 06:38:06 +0100 Subject: [PATCH 2/2] refactor get operator performance --- .../ReportingManager.cs | 39 ------------------- .../ReportingManagerExtensions.cs | 18 ++++++++- .../ReportingManagerRefactored.cs | 27 +++++++++++++ 3 files changed, 44 insertions(+), 40 deletions(-) diff --git a/EstateReportingAPI.BusinessLogic/ReportingManager.cs b/EstateReportingAPI.BusinessLogic/ReportingManager.cs index 0a317a8..52a6c06 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManager.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManager.cs @@ -571,45 +571,6 @@ private Decimal SafeDivide(Decimal number, Int32 divisor) return number / divisor; } - - public async Task GetOperatorPerformance(Guid estateId, DateTime comparisonDate, List operatorReportingIds, CancellationToken cancellationToken){ - using ResolvedDbContext? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString()); - await using EstateManagementContext context = resolvedContext.Context; - - // First we need to get a value of todays sales - var todaysSalesQuery = (from t in context.TodayTransactions - where t.IsAuthorised && t.TransactionType == "Sale" - && t.TransactionDate == DateTime.Now.Date - && t.TransactionTime <= DateTime.Now.TimeOfDay - select t); - - var comparisonSalesQuery = (from t in context.TransactionHistory - where t.IsAuthorised && t.TransactionType == "Sale" - && t.TransactionDate == comparisonDate - && t.TransactionTime <= DateTime.Now.TimeOfDay - select t); - - - if (operatorReportingIds.Any()) - { - todaysSalesQuery = todaysSalesQuery.Where(t => operatorReportingIds.Contains(t.OperatorReportingId)); - comparisonSalesQuery = comparisonSalesQuery.Where(t => operatorReportingIds.Contains(t.OperatorReportingId)); - } - - TodaysSales response = new TodaysSales - { - ComparisonSalesCount = comparisonSalesQuery.Count(), - ComparisonSalesValue = comparisonSalesQuery.Sum(t => t.TransactionAmount), - TodaysSalesCount = todaysSalesQuery.Count(), - TodaysSalesValue = todaysSalesQuery.Sum(t => t.TransactionAmount), - }; - response.ComparisonAverageSalesValue = - SafeDivide(response.ComparisonSalesValue, response.ComparisonSalesCount); - response.TodaysAverageSalesValue = - SafeDivide(response.TodaysSalesValue, response.TodaysSalesCount); - - return response; - } public async Task> GetMerchants(Guid estateId, CancellationToken cancellationToken) { diff --git a/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs b/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs index d31d033..3dc58a4 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs @@ -31,12 +31,28 @@ public static IQueryable ApplyProductFilter(this IQueryable ApplyProductFilter(this IQueryable query, List productReportingIds) { - if (merchantReportingIds == null || productReportingIds.Count == 0) + if (productReportingIds == null || productReportingIds.Count == 0) return query; return query.Where(t => productReportingIds.Contains(t.ContractProductReportingId)).AsQueryable(); } + public static IQueryable ApplyOperatorFilter(this IQueryable query, List operatorReportingIds) + { + if (operatorReportingIds == null || operatorReportingIds.Count == 0) + return query; + + return query.Where(t => operatorReportingIds.Contains(t.OperatorReportingId)).AsQueryable(); + } + + public static IQueryable ApplyOperatorFilter(this IQueryable query, List operatorReportingIds) + { + if (operatorReportingIds == null || operatorReportingIds.Count == 0) + return query; + + return query.Where(t => operatorReportingIds.Contains(t.OperatorReportingId)).AsQueryable(); + } + public static IQueryable ApplyMerchantFilter(this IQueryable query, EstateManagementContext context, List merchantIds) diff --git a/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs b/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs index a938510..6d85045 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs @@ -169,6 +169,33 @@ public async Task GetProductPerformance(Guid estateId, DateTime com return response; } + public async Task GetOperatorPerformance(Guid estateId, DateTime comparisonDate, List operatorReportingIds, CancellationToken cancellationToken) + { + using ResolvedDbContext? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString()); + await using EstateManagementContext context = resolvedContext.Context; + + // First we need to get a value of todays sales + IQueryable todaysSalesQuery = BuildTodaySalesQuery(context); + IQueryable comparisonSalesQuery = BuildComparisonSalesQuery(context, comparisonDate); + + todaysSalesQuery = todaysSalesQuery.ApplyOperatorFilter(operatorReportingIds); + comparisonSalesQuery = comparisonSalesQuery.ApplyOperatorFilter(operatorReportingIds); + + TodaysSales response = new TodaysSales + { + ComparisonSalesCount = await comparisonSalesQuery.CountAsync(cancellationToken), + ComparisonSalesValue = await comparisonSalesQuery.SumAsync(t => t.TransactionAmount, cancellationToken), + TodaysSalesCount = await todaysSalesQuery.CountAsync(cancellationToken), + TodaysSalesValue = await todaysSalesQuery.SumAsync(t => t.TransactionAmount, cancellationToken), + }; + response.ComparisonAverageSalesValue = + SafeDivide(response.ComparisonSalesValue, response.ComparisonSalesCount); + response.TodaysAverageSalesValue = + SafeDivide(response.TodaysSalesValue, response.TodaysSalesCount); + + return response; + } + } public class DatabaseProjections {