diff --git a/EstateReportingAPI.BusinessLogic/ReportingManager.cs b/EstateReportingAPI.BusinessLogic/ReportingManager.cs index 25325f0..52a6c06 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManager.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManager.cs @@ -571,85 +571,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; - - // 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 4fc32b2..3dc58a4 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs @@ -21,6 +21,37 @@ 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 (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, diff --git a/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs b/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs index 97bb522..6d85045 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs @@ -142,6 +142,60 @@ 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 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 {