From a40d612e4d8dd60826d893020ac52c5eb505ecf4 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Thu, 16 Oct 2025 06:17:12 +0100 Subject: [PATCH] merchant performance refactoring --- .../ReportingManager.cs | 38 ------------------- .../ReportingManagerExtensions.cs | 18 +++++++++ .../ReportingManagerRefactored.cs | 37 ++++++++++++++++++ 3 files changed, 55 insertions(+), 38 deletions(-) diff --git a/EstateReportingAPI.BusinessLogic/ReportingManager.cs b/EstateReportingAPI.BusinessLogic/ReportingManager.cs index 4d09e8a..25325f0 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManager.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManager.cs @@ -552,44 +552,6 @@ public async Task> GetTopBottomData(Guid estateId, TopBottom return await queryable.Take(resultCount).ToListAsync(cancellationToken); } - public async Task GetMerchantPerformance(Guid estateId, DateTime comparisonDate, List merchantReportingIds, 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 (merchantReportingIds.Any()){ - todaysSalesQuery = todaysSalesQuery.Where(t => merchantReportingIds.Contains(t.MerchantReportingId)); - comparisonSalesQuery = comparisonSalesQuery.Where(t => merchantReportingIds.Contains(t.MerchantReportingId)); - } - - 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; - } - private Int32 SafeDivide(Int32 number, Int32 divisor) { if (divisor == 0) diff --git a/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs b/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs index aba8d55..4fc32b2 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManagerExtensions.cs @@ -1,9 +1,27 @@ using EstateReportingAPI.Models; using TransactionProcessor.Database.Contexts; +using TransactionProcessor.Database.Entities.Summary; namespace EstateReportingAPI.BusinessLogic; public static class ReportingManagerExtensions{ + public static IQueryable ApplyMerchantFilter(this IQueryable query, List merchantReportingIds) + { + if (merchantReportingIds == null || merchantReportingIds.Count == 0) + return query; + + return query.Where(t => merchantReportingIds.Contains(t.MerchantReportingId)).AsQueryable(); + } + + public static IQueryable ApplyMerchantFilter(this IQueryable query, List merchantReportingIds) + { + if (merchantReportingIds == null || merchantReportingIds.Count == 0) + return query; + + return query.Where(t => merchantReportingIds.Contains(t.MerchantReportingId)).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 26f9678..97bb522 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManagerRefactored.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using TransactionProcessor.Database.Contexts; using TransactionProcessor.Database.Entities; +using TransactionProcessor.Database.Entities.Summary; using Merchant = TransactionProcessor.Database.Entities.Merchant; using Operator = TransactionProcessor.Database.Entities.Operator; @@ -42,6 +43,14 @@ join product in context.ContractProducts on txn.ContractProductId equals product }; } + private IQueryable BuildTodaySalesQuery(EstateManagementContext context) { + return from t in context.TodayTransactions where t.IsAuthorised && t.TransactionType == "Sale" && t.TransactionDate == DateTime.Now.Date && t.TransactionTime <= DateTime.Now.TimeOfDay select t; + } + + private IQueryable BuildComparisonSalesQuery(EstateManagementContext context, DateTime comparisonDate) { + return from t in context.TransactionHistory where t.IsAuthorised && t.TransactionType == "Sale" && t.TransactionDate == comparisonDate && t.TransactionTime <= DateTime.Now.TimeOfDay select t; + } + public async Task> GetUnsettledFees(Guid estateId, DateTime startDate, DateTime endDate, List merchantIds, List operatorIds, List productIds, GroupByOption? groupByOption, CancellationToken cancellationToken) { @@ -105,6 +114,34 @@ public async Task> TransactionSearch(Guid estateId, Tran return results; } + public async Task GetMerchantPerformance(Guid estateId, DateTime comparisonDate, List merchantReportingIds, 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.ApplyMerchantFilter(merchantReportingIds); + comparisonSalesQuery = comparisonSalesQuery.ApplyMerchantFilter(merchantReportingIds); + + // Build the response + 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 {