diff --git a/EstateReportingAPI.BusinessLogic/Services/TransactionReportingService.cs b/EstateReportingAPI.BusinessLogic/Services/TransactionReportingService.cs index 4ade842..287d8f5 100644 --- a/EstateReportingAPI.BusinessLogic/Services/TransactionReportingService.cs +++ b/EstateReportingAPI.BusinessLogic/Services/TransactionReportingService.cs @@ -1,11 +1,12 @@ +using Azure.Core; using EstateReportingAPI.BusinessLogic.Queries; +using EstateReportingAPI.Models; using Microsoft.EntityFrameworkCore; +using Shared.EntityFramework; +using Shared.Results; using SimpleResults; using TransactionProcessor.Database.Contexts; using TransactionProcessor.Database.Entities.Summary; -using Shared.EntityFramework; -using Shared.Results; -using EstateReportingAPI.Models; namespace EstateReportingAPI.BusinessLogic.Services; @@ -44,14 +45,14 @@ public async Task> GetTodaysFailedSales(TransactionQueries.T IQueryable todaysSalesQuery = this.BuildTodaysFailedSalesQuery(context, request.ResponseCode, now); IQueryable comparisonSalesQuery = this.BuildComparisonFailedSalesQuery(context, request.ComparisonDate, request.ResponseCode, now); - var todaysSalesQueryResult = await ReportingQueryExecutor.ToListAsync(todaysSalesQuery, cancellationToken, "Error retrieving todays failed sales"); + Result> todaysSalesQueryResult = await ReportingQueryExecutor.ToListAsync(todaysSalesQuery, cancellationToken, "Error retrieving todays failed sales"); if (todaysSalesQueryResult.IsFailed) return ResultHelpers.CreateFailure(todaysSalesQueryResult); - var comparisonSalesQueryResult = await ReportingQueryExecutor.ToListAsync(comparisonSalesQuery, cancellationToken, "Error retrieving comparison failed sales"); + Result> comparisonSalesQueryResult = await ReportingQueryExecutor.ToListAsync(comparisonSalesQuery, cancellationToken, "Error retrieving comparison failed sales"); if (comparisonSalesQueryResult.IsFailed) return ResultHelpers.CreateFailure(comparisonSalesQueryResult); - var todaysSales = todaysSalesQueryResult.Data; - var comparisonSales = comparisonSalesQueryResult.Data; + List todaysSales = todaysSalesQueryResult.Data; + List comparisonSales = comparisonSalesQueryResult.Data; TodaysSales response = new() { ComparisonSalesCount = comparisonSales.Count, @@ -76,10 +77,10 @@ public async Task> GetTodaysSales(TransactionQueries.TodaysS todaysSales = todaysSales.ApplyMerchantFilter(request.MerchantReportingId).ApplyOperatorFilter(request.OperatorReportingId); comparisonSales = comparisonSales.ApplyMerchantFilter(request.MerchantReportingId).ApplyOperatorFilter(request.OperatorReportingId); - var todaysSalesQueryResult = await ReportingQueryExecutor.ToListAsync(todaysSales, cancellationToken, "Error retrieving todays failed sales"); + Result> todaysSalesQueryResult = await ReportingQueryExecutor.ToListAsync(todaysSales, cancellationToken, "Error retrieving todays failed sales"); if (todaysSalesQueryResult.IsFailed) return ResultHelpers.CreateFailure(todaysSalesQueryResult); - var comparisonSalesQueryResult = await ReportingQueryExecutor.ToListAsync(comparisonSales, cancellationToken, "Error retrieving comparison failed sales"); + Result> comparisonSalesQueryResult = await ReportingQueryExecutor.ToListAsync(comparisonSales, cancellationToken, "Error retrieving comparison failed sales"); if (comparisonSalesQueryResult.IsFailed) return ResultHelpers.CreateFailure(comparisonSalesQueryResult); @@ -119,25 +120,25 @@ public async Task> GetTransactionDetailR using ResolvedDbContext? resolvedContext = Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString()); await using EstateManagementContext context = resolvedContext.Context; - var query = ApplyTransactionDetailFilters(BuildTransactionDetailBaseQuery(context, request.Request), request.Request); - var summaryQuery = query - .GroupBy(_ => 1) - .Select(g => new TransactionDetailSummaryQueryResult { - TransactionCount = g.Count(), - TotalValue = g.Sum(q => q.Value), - TotalFees = g.Sum(q => q.FeeValue) - }); - var summaryResult = await ReportingQueryExecutor.ToListAsync(summaryQuery, cancellationToken, "Error calculating transaction details report summary"); + IQueryable query = ApplyTransactionDetailFilters(BuildTransactionDetailBaseQuery(context, request.Request), request.Request); + IQueryable summaryQuery = query + .GroupBy(_ => 1) + .Select(g => new TransactionDetailSummaryQueryResult { + TransactionCount = g.Count(), + TotalValue = g.Sum(q => q.Value), + TotalFees = g.Sum(q => q.FeeValue) + }); + Result> summaryResult = await ReportingQueryExecutor.ToListAsync(summaryQuery, cancellationToken, "Error calculating transaction details report summary"); if (summaryResult.IsFailed) return ResultHelpers.CreateFailure(summaryResult); TransactionDetailSummaryQueryResult summary = summaryResult.Data.SingleOrDefault() ?? new TransactionDetailSummaryQueryResult(); - var pageQuery = query - .OrderByDescending(q => q.TransactionDateTime) - .ThenByDescending(q => q.TransactionId) - .Skip((int)((long)(request.Request.PageNumber - 1) * request.Request.PageSize)) - .Take(request.Request.PageSize); - var queryResult = await ReportingQueryExecutor.ToListAsync(pageQuery, cancellationToken, "Error retrieving transaction details report"); + IQueryable pageQuery = query + .OrderByDescending(q => q.TransactionDateTime) + .ThenByDescending(q => q.TransactionId) + .Skip((int)((long)(request.Request.PageNumber - 1) * request.Request.PageSize)) + .Take(request.Request.PageSize); + Result> queryResult = await ReportingQueryExecutor.ToListAsync(pageQuery, cancellationToken, "Error retrieving transaction details report"); if (queryResult.IsFailed) return ResultHelpers.CreateFailure(queryResult); @@ -228,8 +229,7 @@ private static TransactionDetailReportResponse MapToTransactionDetailResponse(Li }; } - public async Task> GetTransactionSummaryByMerchantReport(TransactionQueries.TransactionSummaryByMerchantQuery request, - CancellationToken cancellationToken) { + internal static Result ValidateRequest(TransactionQueries.TransactionSummaryByMerchantQuery request) { string? validationError = ReportQueryValidation.ValidateDateRange(request.Request.StartDate, request.Request.EndDate) ?? ReportQueryValidation.ValidatePaging(request.Request.PageNumber, request.Request.PageSize) ?? ReportQueryValidation.ValidateFilterList("merchants", request.Request.Merchants) @@ -237,25 +237,42 @@ public async Task> GetTransactionSu if (validationError != null) return Result.Failure(validationError); + return Result.Success(); + } + + public async Task> GetTransactionSummaryByMerchantReport(TransactionQueries.TransactionSummaryByMerchantQuery request, + CancellationToken cancellationToken) { + Result? validationError = ValidateRequest(request); + if (validationError.IsFailed) + return ResultHelpers.CreateFailure(validationError); + using ResolvedDbContext? resolvedContext = Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString()); await using EstateManagementContext context = resolvedContext.Context; - var query = BuildMerchantTransactionBaseQuery(context, request.Request.StartDate, request.Request.EndDate); + IQueryable query = BuildMerchantTransactionBaseQuery(context, request.Request.StartDate, request.Request.EndDate); - if (request.Request.Merchants != null && request.Request.Merchants.Any()) + if (request.Request.Merchants?.Any() == true) query = query.Where(q => request.Request.Merchants.Contains(q.MerchantReportingId)); - if (request.Request.Operators != null && request.Request.Operators.Any()) + if (request.Request.Operators?.Any() == true) query = query.Where(q => request.Request.Operators.Contains(q.OperatorReportingId)); - var finalQuery = BuildMerchantTransactionFinalQuery(query); - var reportDataResult = await LoadMerchantSummaryReportDataAsync(finalQuery, request.Request, cancellationToken); + IQueryable finalQuery = BuildMerchantTransactionFinalQuery(query); + Result reportDataResult = await LoadMerchantSummaryReportDataAsync(finalQuery, request.Request, cancellationToken); if (reportDataResult.IsFailed) return ResultHelpers.CreateFailure(reportDataResult); - var reportData = reportDataResult.Data; - int totalCount = reportData.TotalCount; - int totalMerchants = reportData.TotalMerchants; - int totalPages = totalMerchants == 0 ? 0 : (int)Math.Ceiling((double)totalMerchants / request.Request.PageSize); + MerchantSummaryReportData reportData = reportDataResult.Data; + + TransactionSummaryByMerchantResponse response = MapMerchantSummaryResponse(reportData, request.Request); + return Result.Success(response); + } + + private TransactionSummaryByMerchantResponse MapMerchantSummaryResponse( + MerchantSummaryReportData reportData, + Models.TransactionSummaryByMerchantRequest request) { + int totalPages = reportData.TotalMerchants == 0 + ? 0 + : (int)Math.Ceiling((double)reportData.TotalMerchants / request.PageSize); return new TransactionSummaryByMerchantResponse { Merchants = reportData.Merchants.Select(q => new MerchantDetail { @@ -270,15 +287,15 @@ public async Task> GetTransactionSu TotalValue = q.TotalValue }).ToList(), Summary = new MerchantDetailSummary { - TotalCount = totalCount, + TotalCount = reportData.TotalCount, TotalValue = reportData.TotalValue, - AverageValue = SafeDivide(reportData.TotalValue, totalCount), - TotalMerchants = totalMerchants + AverageValue = SafeDivide(reportData.TotalValue, reportData.TotalCount), + TotalMerchants = reportData.TotalMerchants }, Pagination = new PaginationMetadata { - PageNumber = request.Request.PageNumber, - PageSize = request.Request.PageSize, - TotalItems = totalMerchants, + PageNumber = request.PageNumber, + PageSize = request.PageSize, + TotalItems = reportData.TotalMerchants, TotalPages = totalPages } }; @@ -288,19 +305,19 @@ private static async Task> LoadMerchantSummary IQueryable query, Models.TransactionSummaryByMerchantRequest request, CancellationToken cancellationToken) { - var merchantCountResult = await ReportingQueryExecutor.CountAsync(query, cancellationToken, "Error counting transaction summary by merchant report rows"); + Result merchantCountResult = await ReportingQueryExecutor.CountAsync(query, cancellationToken, "Error counting transaction summary by merchant report rows"); if (merchantCountResult.IsFailed) return ResultHelpers.CreateFailure(merchantCountResult); - var totalCountResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (int?)q.TotalCount), cancellationToken, "Error summing transaction summary by merchant counts"); + Result totalCountResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (int?)q.TotalCount), cancellationToken, "Error summing transaction summary by merchant counts"); if (totalCountResult.IsFailed) return ResultHelpers.CreateFailure(totalCountResult); - var totalValueResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (decimal?)q.TotalValue), cancellationToken, "Error summing transaction summary by merchant values"); + Result totalValueResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (decimal?)q.TotalValue), cancellationToken, "Error summing transaction summary by merchant values"); if (totalValueResult.IsFailed) return ResultHelpers.CreateFailure(totalValueResult); - var merchantResult = await ReportingQueryExecutor.ToListAsync( + Result> merchantResult = await ReportingQueryExecutor.ToListAsync( query.OrderBy(q => string.IsNullOrWhiteSpace(q.MerchantName) ? "Unknown Merchant" : q.MerchantName) .ThenBy(q => q.MerchantReportingId) .ThenBy(q => q.MerchantId) @@ -369,13 +386,13 @@ public async Task> GetTransactionSu using ResolvedDbContext? resolvedContext = Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString()); await using EstateManagementContext context = resolvedContext.Context; - var baseQuery = BuildOperatorTransactionBaseQuery(context, request); - var finalQuery = BuildOperatorFinalSummaryQuery(baseQuery); + IQueryable baseQuery = BuildOperatorTransactionBaseQuery(context, request); + IQueryable finalQuery = BuildOperatorFinalSummaryQuery(baseQuery); - var reportDataResult = await LoadOperatorSummaryReportDataAsync(finalQuery, request.Request, cancellationToken); + Result reportDataResult = await LoadOperatorSummaryReportDataAsync(finalQuery, request.Request, cancellationToken); if (reportDataResult.IsFailed) return ResultHelpers.CreateFailure(reportDataResult); - var reportData = reportDataResult.Data; + OperatorSummaryReportData reportData = reportDataResult.Data; int totalOperators = reportData.TotalOperators; int totalPages = totalOperators == 0 ? 0 : (int)Math.Ceiling((double)totalOperators / request.Request.PageSize); return BuildOperatorSummaryResponse(reportData.Operators, reportData.TotalCount, reportData.TotalValue, totalOperators, @@ -391,19 +408,19 @@ private static async Task> LoadOperatorSummary IQueryable query, Models.TransactionSummaryByOperatorRequest request, CancellationToken cancellationToken) { - var operatorCountResult = await ReportingQueryExecutor.CountAsync(query, cancellationToken, "Error counting transaction summary by operator report rows"); + Result operatorCountResult = await ReportingQueryExecutor.CountAsync(query, cancellationToken, "Error counting transaction summary by operator report rows"); if (operatorCountResult.IsFailed) return ResultHelpers.CreateFailure(operatorCountResult); - var totalCountResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (int?)q.TotalCount), cancellationToken, "Error summing transaction summary by operator counts"); + Result totalCountResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (int?)q.TotalCount), cancellationToken, "Error summing transaction summary by operator counts"); if (totalCountResult.IsFailed) return ResultHelpers.CreateFailure(totalCountResult); - var totalValueResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (decimal?)q.TotalValue), cancellationToken, "Error summing transaction summary by operator values"); + Result totalValueResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (decimal?)q.TotalValue), cancellationToken, "Error summing transaction summary by operator values"); if (totalValueResult.IsFailed) return ResultHelpers.CreateFailure(totalValueResult); - var operatorResult = await ReportingQueryExecutor.ToListAsync( + Result> operatorResult = await ReportingQueryExecutor.ToListAsync( query.OrderBy(q => string.IsNullOrWhiteSpace(q.OperatorName) ? "Unknown Operator" : q.OperatorName) .ThenBy(q => q.OperatorReportingId) .ThenBy(q => q.OperatorId) @@ -423,31 +440,31 @@ private static async Task> LoadOperatorSummary private static IQueryable BuildOperatorTransactionBaseQuery(EstateManagementContext context, TransactionQueries.TransactionSummaryByOperatorQuery request) { - var query = from t in context.Transactions - join m in context.Merchants on t.MerchantId equals m.MerchantId - join o in context.Operators on t.OperatorId equals o.OperatorId - where t.TransactionType == "Sale" && t.TransactionDate >= request.Request.StartDate.Date && t.TransactionDate < request.Request.EndDate.Date.AddDays(1) - group t by new { - t.MerchantId, - m.MerchantReportingId, - MerchantName = m.Name, - t.OperatorId, - o.OperatorReportingId, - OperatorName = o.Name - } - into g - select new OperatorTransactionData { - MerchantId = g.Key.MerchantId, - MerchantReportingId = g.Key.MerchantReportingId, - MerchantName = g.Key.MerchantName, - OperatorId = g.Key.OperatorId, - OperatorReportingId = g.Key.OperatorReportingId, - OperatorName = g.Key.OperatorName, - TotalCount = g.Count(), - TotalValue = g.Sum(x => x.TransactionAmount), - AuthorisedCount = g.Sum(x => x.IsAuthorised ? 1 : 0), - DeclinedCount = g.Sum(x => x.IsAuthorised ? 0 : 1) - }; + IQueryable query = from t in context.Transactions + join m in context.Merchants on t.MerchantId equals m.MerchantId + join o in context.Operators on t.OperatorId equals o.OperatorId + where t.TransactionType == "Sale" && t.TransactionDate >= request.Request.StartDate.Date && t.TransactionDate < request.Request.EndDate.Date.AddDays(1) + group t by new { + t.MerchantId, + m.MerchantReportingId, + MerchantName = m.Name, + t.OperatorId, + o.OperatorReportingId, + OperatorName = o.Name + } + into g + select new OperatorTransactionData { + MerchantId = g.Key.MerchantId, + MerchantReportingId = g.Key.MerchantReportingId, + MerchantName = g.Key.MerchantName, + OperatorId = g.Key.OperatorId, + OperatorReportingId = g.Key.OperatorReportingId, + OperatorName = g.Key.OperatorName, + TotalCount = g.Count(), + TotalValue = g.Sum(x => x.TransactionAmount), + AuthorisedCount = g.Sum(x => x.IsAuthorised ? 1 : 0), + DeclinedCount = g.Sum(x => x.IsAuthorised ? 0 : 1) + }; return ApplyOperatorTransactionFilters(query, request.Request); } @@ -516,10 +533,10 @@ public async Task> GetProductPerformanceRepor using ResolvedDbContext? resolvedContext = Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString()); await using EstateManagementContext context = resolvedContext.Context; - var reportDataResult = await LoadProductPerformanceReportDataAsync(context, request, cancellationToken); + Result reportDataResult = await LoadProductPerformanceReportDataAsync(context, request, cancellationToken); if (reportDataResult.IsFailed) return ResultHelpers.CreateFailure(reportDataResult); - var reportData = reportDataResult.Data; + ProductPerformanceReportData reportData = reportDataResult.Data; int totalProducts = reportData.TotalProducts; int totalCount = reportData.TotalCount; int totalPages = totalProducts == 0 ? 0 : (int)Math.Ceiling((double)totalProducts / request.PageSize); @@ -540,19 +557,19 @@ private static async Task> LoadProductPerfo EstateManagementContext context, TransactionQueries.ProductPerformanceQuery request, CancellationToken cancellationToken) { - var grandTotalAmountQuery = from t in context.Transactions - where t.TransactionType == "Sale" && t.TransactionDate >= request.StartDate.Date && t.TransactionDate < request.EndDate.Date.AddDays(1) - select t.TransactionAmount; - var grandTotalAmountResult = await ReportingQueryExecutor.SumAsync(grandTotalAmountQuery, cancellationToken); + IQueryable grandTotalAmountQuery = from t in context.Transactions + where t.TransactionType == "Sale" && t.TransactionDate >= request.StartDate.Date && t.TransactionDate < request.EndDate.Date.AddDays(1) + select t.TransactionAmount; + Result grandTotalAmountResult = await ReportingQueryExecutor.SumAsync(grandTotalAmountQuery, cancellationToken); if (grandTotalAmountResult.IsFailed) return ResultHelpers.CreateFailure(grandTotalAmountResult); - var query = BuildProductPerformanceQuery(context, request.StartDate, request.EndDate, grandTotalAmountResult.Data); - var totalsResult = await LoadProductPerformanceTotalsAsync(query, cancellationToken); + IQueryable query = BuildProductPerformanceQuery(context, request.StartDate, request.EndDate, grandTotalAmountResult.Data); + Result totalsResult = await LoadProductPerformanceTotalsAsync(query, cancellationToken); if (totalsResult.IsFailed) return ResultHelpers.CreateFailure(totalsResult); - var productsResult = await ReportingQueryExecutor.ToListAsync( + Result> productsResult = await ReportingQueryExecutor.ToListAsync( query.OrderBy(q => string.IsNullOrWhiteSpace(q.ProductName) ? "Unknown Product" : q.ProductName) .ThenBy(q => q.ContractReportingId) .ThenBy(q => q.ContractProductReportingId) @@ -574,15 +591,15 @@ private static async Task> LoadProductPerfo private static async Task> LoadProductPerformanceTotalsAsync( IQueryable query, CancellationToken cancellationToken) { - var productCountResult = await ReportingQueryExecutor.CountAsync(query, cancellationToken, "Error counting product performance rows"); + Result productCountResult = await ReportingQueryExecutor.CountAsync(query, cancellationToken, "Error counting product performance rows"); if (productCountResult.IsFailed) return ResultHelpers.CreateFailure(productCountResult); - var totalCountResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (int?)q.TransactionCount), cancellationToken, "Error summing product performance counts"); + Result totalCountResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (int?)q.TransactionCount), cancellationToken, "Error summing product performance counts"); if (totalCountResult.IsFailed) return ResultHelpers.CreateFailure(totalCountResult); - var totalValueResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (decimal?)q.TotalAmount), cancellationToken, "Error summing product performance values"); + Result totalValueResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (decimal?)q.TotalAmount), cancellationToken, "Error summing product performance values"); if (totalValueResult.IsFailed) return ResultHelpers.CreateFailure(totalValueResult); @@ -602,20 +619,20 @@ public async Task> GetTransactionMixSummar using ResolvedDbContext? resolvedContext = Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString()); await using EstateManagementContext context = resolvedContext.Context; - var detailRequest = new TransactionDetailReportRequest - { - Merchants = request.Request.MerchantReportingId.HasValue ? new List { request.Request.MerchantReportingId.Value } : [], - Operators = [], - Products = [], - StartDate = request.Request.StartDate, - EndDate = request.Request.EndDate - }; - - var query = ApplyTransactionDetailFilters(BuildTransactionDetailBaseQuery(context, detailRequest), detailRequest); - var reportDataResult = await LoadTransactionMixReportDataAsync(query, request.Request, cancellationToken); + TransactionDetailReportRequest detailRequest = new TransactionDetailReportRequest + { + Merchants = request.Request.MerchantReportingId.HasValue ? new List { request.Request.MerchantReportingId.Value } : [], + Operators = [], + Products = [], + StartDate = request.Request.StartDate, + EndDate = request.Request.EndDate + }; + + IQueryable query = ApplyTransactionDetailFilters(BuildTransactionDetailBaseQuery(context, detailRequest), detailRequest); + Result reportDataResult = await LoadTransactionMixReportDataAsync(query, request.Request, cancellationToken); if (reportDataResult.IsFailed) return ResultHelpers.CreateFailure(reportDataResult); - var reportData = reportDataResult.Data; + TransactionMixReportData reportData = reportDataResult.Data; int totalCount = reportData.TotalCount; int totalPages = totalCount == 0 ? 0 : (int)Math.Ceiling((double)totalCount / request.Request.PageSize); return Result.Success(BuildTransactionMixSummaryResponse( @@ -644,21 +661,21 @@ private static async Task> LoadTransactionMixRe IQueryable query, TransactionMixSummaryRequest request, CancellationToken cancellationToken) { - var totalCountResult = await ReportingQueryExecutor.CountAsync(query, cancellationToken, "Error counting transaction mix summary rows"); + Result totalCountResult = await ReportingQueryExecutor.CountAsync(query, cancellationToken, "Error counting transaction mix summary rows"); if (totalCountResult.IsFailed) return ResultHelpers.CreateFailure(totalCountResult); - var totalValueResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (decimal?)q.Value), cancellationToken, "Error summing transaction mix summary values"); + Result totalValueResult = await ReportingQueryExecutor.SumAsync(query.Select(q => (decimal?)q.Value), cancellationToken, "Error summing transaction mix summary values"); if (totalValueResult.IsFailed) return ResultHelpers.CreateFailure(totalValueResult); IQueryable groupQuery = BuildTransactionMixGroupQuery(query, request.Breakdown); - var groupResult = await ReportingQueryExecutor.ToListAsync(BuildOrderedTransactionMixGroupQuery(groupQuery, request).Take(request.TopN), cancellationToken, + Result> groupResult = await ReportingQueryExecutor.ToListAsync(BuildOrderedTransactionMixGroupQuery(groupQuery, request).Take(request.TopN), cancellationToken, "Error retrieving transaction mix groups"); if (groupResult.IsFailed) return ResultHelpers.CreateFailure(groupResult); - var pageResult = await ReportingQueryExecutor.ToListAsync(BuildTransactionMixPageQuery(query, request), cancellationToken, + Result> pageResult = await ReportingQueryExecutor.ToListAsync(BuildTransactionMixPageQuery(query, request), cancellationToken, "Error retrieving transaction mix summary transactions"); if (pageResult.IsFailed) return ResultHelpers.CreateFailure(pageResult); @@ -706,7 +723,7 @@ public async Task> GetRecentActiv RecentActivityReceiptRequestParameters parameters = BuildRecentActivityReceiptRequestParameters(request.Request); IQueryable query = BuildRecentActivityReceiptQuery(context, parameters); - var totalCountResult = await ReportingQueryExecutor.CountAsync(query, cancellationToken, "Error counting recent activity receipt report rows"); + Result totalCountResult = await ReportingQueryExecutor.CountAsync(query, cancellationToken, "Error counting recent activity receipt report rows"); if (totalCountResult.IsFailed) return ResultHelpers.CreateFailure(totalCountResult); @@ -714,8 +731,8 @@ public async Task> GetRecentActiv if (totalCount == 0) return Result.Success(BuildEmptyRecentActivityReceiptReportResponse(parameters)); - var pageQuery = query.Skip((parameters.PageNumber - 1) * parameters.PageSize).Take(parameters.PageSize); - var pageResult = await ReportingQueryExecutor.ToListAsync(pageQuery, cancellationToken, "Error retrieving recent activity receipt report"); + IQueryable pageQuery = query.Skip((parameters.PageNumber - 1) * parameters.PageSize).Take(parameters.PageSize); + Result> pageResult = await ReportingQueryExecutor.ToListAsync(pageQuery, cancellationToken, "Error retrieving recent activity receipt report"); if (pageResult.IsFailed) return ResultHelpers.CreateFailure(pageResult); @@ -973,26 +990,26 @@ public async Task>> GetTodaysSalesByHour(Transact return ResultHelpers.CreateFailure(comparisonSalesByHourQueryResult); var comparisonSalesByHour = comparisonSalesByHourQueryResult.Data; - var response = (from today in todaysSalesByHour - join comparison in comparisonSalesByHour on today.Hour equals comparison.Hour into compGroup - from comparison in compGroup.DefaultIfEmpty() - select new TodaysSalesByHour { - Hour = today.Hour.Value, - TodaysSalesCount = today.TotalSalesCount, - TodaysSalesValue = today.TotalSalesValue, - ComparisonSalesCount = comparison?.TotalSalesCount ?? 0, - ComparisonSalesValue = comparison?.TotalSalesValue ?? 0 - }).Union(from comparison in comparisonSalesByHour - join today in todaysSalesByHour on comparison.Hour equals today.Hour into todayGroup - from today in todayGroup.DefaultIfEmpty() - where today == null - select new TodaysSalesByHour { - Hour = comparison.Hour.Value, - TodaysSalesCount = 0, - TodaysSalesValue = 0, - ComparisonSalesCount = comparison.TotalSalesCount, - ComparisonSalesValue = comparison.TotalSalesValue - }).ToList(); + List response = (from today in todaysSalesByHour + join comparison in comparisonSalesByHour on today.Hour equals comparison.Hour into compGroup + from comparison in compGroup.DefaultIfEmpty() + select new TodaysSalesByHour { + Hour = today.Hour.Value, + TodaysSalesCount = today.TotalSalesCount, + TodaysSalesValue = today.TotalSalesValue, + ComparisonSalesCount = comparison?.TotalSalesCount ?? 0, + ComparisonSalesValue = comparison?.TotalSalesValue ?? 0 + }).Union(from comparison in comparisonSalesByHour + join today in todaysSalesByHour on comparison.Hour equals today.Hour into todayGroup + from today in todayGroup.DefaultIfEmpty() + where today == null + select new TodaysSalesByHour { + Hour = comparison.Hour.Value, + TodaysSalesCount = 0, + TodaysSalesValue = 0, + ComparisonSalesCount = comparison.TotalSalesCount, + ComparisonSalesValue = comparison.TotalSalesValue + }).ToList(); return Result.Success(response); @@ -1011,18 +1028,18 @@ public async Task> GetMerchantDa DateTime endDate = request.Request.EndDate.Date; int dayCount = Math.Max((endDate - startDate).Days + 1, 1); - var groupedTransactionsResult = await LoadMerchantDailyPerformanceGroups(context, request, startDate, endDate, cancellationToken); + Result> groupedTransactionsResult = await LoadMerchantDailyPerformanceGroups(context, request, startDate, endDate, cancellationToken); if (groupedTransactionsResult.IsFailed) return ResultHelpers.CreateFailure(groupedTransactionsResult); - var groupedTransactions = groupedTransactionsResult.Data; + List groupedTransactions = groupedTransactionsResult.Data; if (groupedTransactions.Any() == false) { return Result.Success(BuildEmptyMerchantDailyPerformanceSummaryResponse()); } List metrics = BuildMerchantDailyPerformanceMetrics(groupedTransactions, dayCount); - var recentSalesResult = await LoadMerchantDailyPerformanceRecentSales(context, request, startDate, endDate, cancellationToken); + Result> recentSalesResult = await LoadMerchantDailyPerformanceRecentSales(context, request, startDate, endDate, cancellationToken); if (recentSalesResult.IsFailed) return ResultHelpers.CreateFailure(recentSalesResult); @@ -1181,7 +1198,7 @@ private async Task>> LoadMe DateTime startDate, DateTime endDate, CancellationToken cancellationToken) { - var query = + IQueryable query = from t in context.Transactions join m in context.Merchants on t.MerchantId equals m.MerchantId join cp in context.ContractProducts on new { t.ContractProductId, t.ContractId } equals new { cp.ContractProductId, cp.ContractId } @@ -1217,7 +1234,7 @@ private async Task>> L DateTime startDate, DateTime endDate, CancellationToken cancellationToken) { - var query = + IQueryable query = (from t in context.Transactions join m in context.Merchants on t.MerchantId equals m.MerchantId join cp in context.ContractProducts on new { t.ContractProductId, t.ContractId } equals new { cp.ContractProductId, cp.ContractId }