diff --git a/Directory.Packages.props b/Directory.Packages.props index bd1bc40..e5cef7b 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -12,13 +12,13 @@ - - + + - + @@ -50,6 +50,6 @@ - + - + \ No newline at end of file diff --git a/EstateReportingAPI.BusinessLogic.UnitTests/ReportQueryValidationTests.cs b/EstateReportingAPI.BusinessLogic.UnitTests/ReportQueryValidationTests.cs index c0a3b06..e1cefd9 100644 --- a/EstateReportingAPI.BusinessLogic.UnitTests/ReportQueryValidationTests.cs +++ b/EstateReportingAPI.BusinessLogic.UnitTests/ReportQueryValidationTests.cs @@ -10,8 +10,8 @@ public sealed class ReportQueryValidationTests public void ValidateDateRange_AllowsThirtyInclusiveDays() { ReportQueryValidation.ValidateDateRange( - new DateTime(2026, 9, 1), - new DateTime(2026, 9, 30)) + new DateOnly(2026, 9, 1), + new DateOnly(2026, 9, 30)) .ShouldBeNull(); } @@ -19,8 +19,8 @@ public void ValidateDateRange_AllowsThirtyInclusiveDays() public void ValidateDateRange_RejectsMoreThanThirtyInclusiveDays() { ReportQueryValidation.ValidateDateRange( - new DateTime(2026, 9, 1), - new DateTime(2026, 10, 1)) + new DateOnly(2026, 9, 1), + new DateOnly(2026, 10, 1)) .ShouldBe("date range must not exceed 30 inclusive calendar days."); } @@ -28,8 +28,8 @@ public void ValidateDateRange_RejectsMoreThanThirtyInclusiveDays() public void ValidateDateRange_RejectsReversedDates() { ReportQueryValidation.ValidateDateRange( - new DateTime(2026, 9, 2), - new DateTime(2026, 9, 1)) + new DateOnly(2026, 9, 2), + new DateOnly(2026, 9, 1)) .ShouldBe("startDate must be less than or equal to endDate."); } diff --git a/EstateReportingAPI.BusinessLogic.UnitTests/ReportingManagerExtensionsTests.cs b/EstateReportingAPI.BusinessLogic.UnitTests/ReportingManagerExtensionsTests.cs index 27c7716..5215909 100644 --- a/EstateReportingAPI.BusinessLogic.UnitTests/ReportingManagerExtensionsTests.cs +++ b/EstateReportingAPI.BusinessLogic.UnitTests/ReportingManagerExtensionsTests.cs @@ -194,7 +194,7 @@ public void SettlementFiltersAndFeeGroupingsFilterAndAggregateRows() ContractId = contractId, ContractProductId = productId, TransactionType = "Sale", - TransactionDate = new DateTime(2026, 9, 1), + TransactionDate = new DateOnly(2026, 9, 1), TransactionDateTime = new DateTime(2026, 9, 1), TransactionTime = TimeSpan.Zero, TransactionAmount = 10m, diff --git a/EstateReportingAPI.BusinessLogic.UnitTests/ReportingManagerReportTests.cs b/EstateReportingAPI.BusinessLogic.UnitTests/ReportingManagerReportTests.cs index 5806f56..2c31727 100644 --- a/EstateReportingAPI.BusinessLogic.UnitTests/ReportingManagerReportTests.cs +++ b/EstateReportingAPI.BusinessLogic.UnitTests/ReportingManagerReportTests.cs @@ -28,7 +28,7 @@ public async Task GetCalendarComparisonDates_ReturnsCalendarRows() result.IsSuccess.ShouldBeTrue(); result.Data.Count.ShouldBe(1); - result.Data[0].Date.ShouldBe(new DateTime(2026, 9, 1)); + result.Data[0].Date.ShouldBe(new DateOnly(2026, 9, 1)); } [Fact] @@ -168,7 +168,7 @@ public async Task GetFileImportLogList_WhenNoLogs_ReturnsEmptyList() await using TestDatabase database = await TestDatabase.CreateAsync(); var result = await database.FileImportService.GetFileImportLogList( - new FileImportLogQueries.GetFileImportLogListQuery(EstateId, null, DateTime.Today.AddDays(-1), DateTime.Today), + new FileImportLogQueries.GetFileImportLogListQuery(EstateId, null, DateOnly.FromDateTime(DateTime.Today.AddDays(-1)), DateOnly.FromDateTime(DateTime.Today)), CancellationToken.None); result.IsSuccess.ShouldBeTrue(); @@ -183,7 +183,7 @@ public async Task GetFileImportLogList_WithFileDataBuildsHierarchicalResult() await database.SaveAsync(); var result = await database.FileImportService.GetFileImportLogList( - new FileImportLogQueries.GetFileImportLogListQuery(EstateId, null, DateTime.Today.AddDays(-1), DateTime.Today), + new FileImportLogQueries.GetFileImportLogListQuery(EstateId, null, DateOnly.FromDateTime(DateTime.Today.AddDays(-1)), DateOnly.FromDateTime(DateTime.Today)), CancellationToken.None); result.IsSuccess.ShouldBeTrue(); @@ -245,8 +245,8 @@ public async Task GetTransactionSummaryByMerchantReport_AverageUsesGroupedTotals new TransactionQueries.TransactionSummaryByMerchantQuery( EstateId, new TransactionSummaryByMerchantRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1) + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1) }), CancellationToken.None); @@ -268,8 +268,8 @@ public async Task GetTransactionSummaryByOperatorReport_SeparatesAuthorisedAndDe new TransactionQueries.TransactionSummaryByOperatorQuery( EstateId, new TransactionSummaryByOperatorRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1) + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1) }), CancellationToken.None); @@ -295,8 +295,8 @@ public async Task GetTransactionDetailReport_AppliesMerchantProductAndOperatorFi new TransactionQueries.TransactionDetailReportQuery( EstateId, new TransactionDetailReportRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1), + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1), Merchants = [20], Products = [40], Operators = [10] @@ -321,8 +321,8 @@ public async Task GetTransactionDetailReport_PaginatesRowsButKeepsFullSummary() new TransactionQueries.TransactionDetailReportQuery( EstateId, new TransactionDetailReportRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1), + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1), PageNumber = 2, PageSize = 2 }), @@ -347,8 +347,8 @@ public async Task GetTransactionDetailReport_RejectsDateRangesOverThirtyDays() new TransactionQueries.TransactionDetailReportQuery( EstateId, new TransactionDetailReportRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 10, 1) + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 10, 1) }), CancellationToken.None); @@ -368,8 +368,8 @@ public async Task GetTransactionSummaryByOperatorReport_AppliesMerchantAndOperat new TransactionQueries.TransactionSummaryByOperatorQuery( EstateId, new TransactionSummaryByOperatorRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1), + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1), Merchants = [20], Operators = [10] }), @@ -388,8 +388,8 @@ public async Task GetTransactionSummaryByMerchantReport_WhenNoSales_ReturnsZeroR new TransactionQueries.TransactionSummaryByMerchantQuery( EstateId, new TransactionSummaryByMerchantRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1) + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1) }), CancellationToken.None); @@ -411,8 +411,8 @@ public async Task GetTransactionSummaryByMerchantReport_PaginatesMerchantsButKee new TransactionQueries.TransactionSummaryByMerchantQuery( EstateId, new TransactionSummaryByMerchantRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1), + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1), PageNumber = 2, PageSize = 1 }), @@ -438,8 +438,8 @@ public async Task GetTransactionSummaryByOperatorReport_PaginatesOperatorsButKee new TransactionQueries.TransactionSummaryByOperatorQuery( EstateId, new TransactionSummaryByOperatorRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1), + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1), PageNumber = 2, PageSize = 1 }), @@ -462,8 +462,8 @@ public async Task GetTransactionMixSummary_WhenDateRangeIsInvalid_ReturnsFailure new TransactionQueries.TransactionMixSummaryQuery( EstateId, new TransactionMixSummaryRequest { - StartDate = new DateTime(2026, 9, 2), - EndDate = new DateTime(2026, 9, 1), + StartDate = new DateOnly(2026, 9, 2), + EndDate = new DateOnly(2026, 9, 1), Breakdown = TransactionMixBreakdown.Product, Measure = TransactionMixMeasure.Count }), @@ -481,8 +481,8 @@ public async Task GetTransactionMixSummary_WhenBreakdownIsUnsupported_ReturnsFai new TransactionQueries.TransactionMixSummaryQuery( EstateId, new TransactionMixSummaryRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1), + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1), Breakdown = (TransactionMixBreakdown)999, Measure = TransactionMixMeasure.Count }), @@ -548,8 +548,8 @@ public async Task GetTransactionDetailReport_IncludesFeesAndZeroFeeForUnsettledR new TransactionQueries.TransactionDetailReportQuery( EstateId, new TransactionDetailReportRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1) + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1) }), CancellationToken.None); @@ -574,8 +574,8 @@ public async Task GetTransactionDetailReport_IncludesBothDateBoundaries() new TransactionQueries.TransactionDetailReportQuery( EstateId, new TransactionDetailReportRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 2) + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 2) }), CancellationToken.None); @@ -590,7 +590,7 @@ public async Task GetTodaysSettlement_WhenNoSettlementRows_ReturnsZeroTotals() await using TestDatabase database = await TestDatabase.CreateAsync(); var result = await database.SettlementService.GetTodaysSettlement( - new SettlementQueries.TodaysSettlementQuery(EstateId, DateTime.Today.AddDays(-1)), + new SettlementQueries.TodaysSettlementQuery(EstateId, DateOnly.FromDateTime(DateTime.Today.AddDays(-1))), CancellationToken.None); result.IsSuccess.ShouldBeTrue(); @@ -654,8 +654,8 @@ public async Task GetMerchantDailyPerformanceSummary_ReturnsMetricsTopProductAnd EstateId, new MerchantDailyPerformanceSummaryRequest { MerchantReportingId = 20, - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 2) + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 2) }), CancellationToken.None); @@ -683,8 +683,8 @@ public async Task GetMerchantDailyPerformanceSummary_WhenNoTransactions_ReturnsB EstateId, new MerchantDailyPerformanceSummaryRequest { MerchantReportingId = 20, - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 2) + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 2) }), CancellationToken.None); @@ -704,8 +704,8 @@ public async Task GetMerchantDailyPerformanceSummary_RejectsDateRangesOverThirty EstateId, new MerchantDailyPerformanceSummaryRequest { MerchantReportingId = 20, - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 10, 1) + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 10, 1) }), CancellationToken.None); @@ -763,7 +763,7 @@ public async Task GetProductPerformanceReport_WithSalesMapsDetailsAndSummary() await database.SaveAsync(); var result = await database.TransactionService.GetProductPerformanceReport( - new TransactionQueries.ProductPerformanceQuery(EstateId, new DateTime(2026, 9, 1), new DateTime(2026, 9, 1)), + new TransactionQueries.ProductPerformanceQuery(EstateId, new DateOnly(2026, 9, 1), new DateOnly(2026, 9, 1)), CancellationToken.None); result.IsSuccess.ShouldBeTrue(); @@ -894,8 +894,8 @@ public async Task GetTransactionMixSummary_GroupsByStatusAndOrdersByValue() new TransactionQueries.TransactionMixSummaryQuery( EstateId, new TransactionMixSummaryRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1), + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1), Breakdown = TransactionMixBreakdown.Status, Measure = TransactionMixMeasure.Value, TopN = 1 @@ -925,8 +925,8 @@ public async Task GetTransactionMixSummary_PaginatesTransactionsAndLimitsGroups( new TransactionQueries.TransactionMixSummaryQuery( EstateId, new TransactionMixSummaryRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1), + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1), Breakdown = TransactionMixBreakdown.Status, Measure = TransactionMixMeasure.Count, TopN = 1, @@ -953,8 +953,8 @@ public async Task GetTransactionMixSummary_RejectsTopNAboveTwenty() new TransactionQueries.TransactionMixSummaryQuery( EstateId, new TransactionMixSummaryRequest { - StartDate = new DateTime(2026, 9, 1), - EndDate = new DateTime(2026, 9, 1), + StartDate = new DateOnly(2026, 9, 1), + EndDate = new DateOnly(2026, 9, 1), Breakdown = TransactionMixBreakdown.Status, Measure = TransactionMixMeasure.Count, TopN = 21 @@ -994,7 +994,7 @@ public async Task GetProductPerformanceReport_WhenNoSales_ReturnsZeroSummary() await using TestDatabase database = await TestDatabase.CreateAsync(); var result = await database.TransactionService.GetProductPerformanceReport( - new TransactionQueries.ProductPerformanceQuery(EstateId, new DateTime(2026, 9, 1), new DateTime(2026, 9, 1)), + new TransactionQueries.ProductPerformanceQuery(EstateId, new DateOnly(2026, 9, 1), new DateOnly(2026, 9, 1)), CancellationToken.None); result.IsSuccess.ShouldBeTrue(); @@ -1013,8 +1013,8 @@ public async Task GetProductPerformanceReport_ReturnsPagedProductsAndFullSummary var result = await database.TransactionService.GetProductPerformanceReport( new TransactionQueries.ProductPerformanceQuery( EstateId, - new DateTime(2026, 9, 1), - new DateTime(2026, 9, 1), + new DateOnly(2026, 9, 1), + new DateOnly(2026, 9, 1), 1, 1), CancellationToken.None); @@ -1151,7 +1151,7 @@ public Guid AddSale(Guid merchantId, Guid operatorId, decimal amount, DateTime d ContractId = ContractId, ContractProductId = ProductId, TransactionType = "Sale", - TransactionDate = date.Date, + TransactionDate = DateOnly.FromDateTime(date.Date), TransactionDateTime = date, TransactionTime = date.TimeOfDay, TransactionAmount = amount, @@ -1256,7 +1256,7 @@ public void AddBalance(Guid merchantId, decimal balance) public void AddCalendar(DateTime date) { seedContext.Calendar.Add(new Db.Calendar { - Date = date, + Date = DateOnly.FromDateTime(date), DayOfWeek = date.DayOfWeek.ToString(), DayOfWeekShort = date.DayOfWeek.ToString()[..3], MonthNameLong = date.ToString("MMMM"), @@ -1295,7 +1295,7 @@ public Guid AddFileImportData() seedContext.FileImportLogs.Add(new Db.FileImportLog { FileImportLogId = logId, EstateId = EstateId, - ImportLogDate = DateTime.Today, + ImportLogDate = DateOnly.FromDateTime(DateTime.Today), ImportLogDateTime = DateTime.Today.AddHours(1) }); seedContext.EstateSecurityUsers.Add(new Db.EstateSecurityUser { @@ -1329,7 +1329,7 @@ public void AddSettlementFee(Guid transactionId, decimal feeValue) SettlementId = settlementId, EstateId = EstateId, MerchantId = MerchantId, - SettlementDate = new DateTime(2026, 9, 1), + SettlementDate = new DateOnly(2026, 9, 1), ProcessingStarted = true, IsCompleted = true, ProcessingStartedDateTIme = new DateTime(2026, 9, 1) diff --git a/EstateReportingAPI.BusinessLogic.UnitTests/ReportingQueryExecutorTests.cs b/EstateReportingAPI.BusinessLogic.UnitTests/ReportingQueryExecutorTests.cs index e3345d8..d74c4e5 100644 --- a/EstateReportingAPI.BusinessLogic.UnitTests/ReportingQueryExecutorTests.cs +++ b/EstateReportingAPI.BusinessLogic.UnitTests/ReportingQueryExecutorTests.cs @@ -70,7 +70,7 @@ private static TransactionProcessor.Database.Entities.Calendar CreateCalendar(Da { return new TransactionProcessor.Database.Entities.Calendar { - Date = date, + Date = DateOnly.FromDateTime(date), Year = year, DayOfWeek = "Monday", DayOfWeekShort = "Mon", diff --git a/EstateReportingAPI.BusinessLogic.UnitTests/RequestHandlerTests.cs b/EstateReportingAPI.BusinessLogic.UnitTests/RequestHandlerTests.cs index 6ba11c6..021d315 100644 --- a/EstateReportingAPI.BusinessLogic.UnitTests/RequestHandlerTests.cs +++ b/EstateReportingAPI.BusinessLogic.UnitTests/RequestHandlerTests.cs @@ -21,7 +21,7 @@ public async Task SettlementRequestHandler_ForwardsRequestAndCancellationToken() { var manager = new ISettlementReportingServiceImposter(); var expected = Result.Success(new TodaysSettlement()); - var request = new SettlementQueries.TodaysSettlementQuery(Guid.NewGuid(), DateTime.Today); + var request = new SettlementQueries.TodaysSettlementQuery(Guid.NewGuid(), DateOnly.FromDateTime(DateTime.Today)); var cancellationToken = new CancellationTokenSource().Token; manager.GetTodaysSettlement(Arg.Any(), Arg.Any()) .Returns(Task.FromResult(expected)); @@ -152,7 +152,7 @@ public async Task EstateRequestHandler_ForwardsEstateOperatorsRequest() public async Task FileImportLogRequestHandler_ForwardsRequest() { var manager = new IFileImportReportingServiceImposter(); - var request = new FileImportLogQueries.GetFileImportLogListQuery(Guid.NewGuid(), null, DateTime.Today, DateTime.Today); + var request = new FileImportLogQueries.GetFileImportLogListQuery(Guid.NewGuid(), null, DateOnly.FromDateTime(DateTime.Today), DateOnly.FromDateTime(DateTime.Today)); manager.GetFileImportLogList(Arg.Any(), Arg.Any()) .Returns(Task.FromResult(Result.Success(new List()))); @@ -334,7 +334,7 @@ public async Task OperatorRequestHandler_ForwardsOperatorRequest() public async Task TransactionRequestHandler_ForwardsRequest() { var manager = new ITransactionReportingServiceImposter(); - var request = new TransactionQueries.ProductPerformanceQuery(Guid.NewGuid(), DateTime.Today, DateTime.Today); + var request = new TransactionQueries.ProductPerformanceQuery(Guid.NewGuid(), DateOnly.FromDateTime(DateTime.Today), DateOnly.FromDateTime(DateTime.Today)); manager.GetProductPerformanceReport(Arg.Any(), Arg.Any()) .Returns(Task.FromResult(Result.Success(new ProductPerformanceResponse()))); diff --git a/EstateReportingAPI.BusinessLogic.UnitTests/UnitTest1.cs b/EstateReportingAPI.BusinessLogic.UnitTests/UnitTest1.cs index b644e82..da5d1cf 100644 --- a/EstateReportingAPI.BusinessLogic.UnitTests/UnitTest1.cs +++ b/EstateReportingAPI.BusinessLogic.UnitTests/UnitTest1.cs @@ -42,7 +42,7 @@ public async Task ReportingService_GetCalendarYears_YearsAreReturned(){ await context.Database.EnsureCreatedAsync(); await context.Calendar.AddRangeAsync(new Calendar{ - Date = new DateTime(2023, 1, 1), + Date = new DateOnly(2023, 1, 1), DayOfWeek = "Monday", DayOfWeekShort = "Mon", MonthNameLong = "January", @@ -53,7 +53,7 @@ await context.Calendar.AddRangeAsync(new Calendar{ }, new Calendar { - Date = new DateTime(2022, 1, 1), + Date = new DateOnly(2022, 1, 1), DayOfWeek = "Monday", DayOfWeekShort = "Mon", MonthNameLong = "January", @@ -64,7 +64,7 @@ await context.Calendar.AddRangeAsync(new Calendar{ }, new Calendar { - Date = new DateTime(2021, 1, 1), + Date = new DateOnly(2021, 1, 1), DayOfWeek = "Monday", DayOfWeekShort = "Mon", MonthNameLong = "January", diff --git a/EstateReportingAPI.BusinessLogic/DatabaseModels.cs b/EstateReportingAPI.BusinessLogic/DatabaseModels.cs index 168ec81..eac0ce0 100644 --- a/EstateReportingAPI.BusinessLogic/DatabaseModels.cs +++ b/EstateReportingAPI.BusinessLogic/DatabaseModels.cs @@ -6,7 +6,7 @@ internal sealed class MerchantData { public Guid MerchantId { get; init; } public int MerchantReportingId { get; init; } public string? Name { get; init; } - public DateTime CreatedDateTime { get; init; } + public DateTimeOffset CreatedDateTime { get; init; } public string? Reference { get; init; } public int SettlementSchedule { get; init; } public MerchantAddressData? AddressInfo { get; init; } diff --git a/EstateReportingAPI.BusinessLogic/Queries/FileImportLogQueries.cs b/EstateReportingAPI.BusinessLogic/Queries/FileImportLogQueries.cs index 7ff5b68..304afe2 100644 --- a/EstateReportingAPI.BusinessLogic/Queries/FileImportLogQueries.cs +++ b/EstateReportingAPI.BusinessLogic/Queries/FileImportLogQueries.cs @@ -8,7 +8,7 @@ namespace EstateReportingAPI.BusinessLogic.Queries; [ExcludeFromCodeCoverage] public record FileImportLogQueries { - public record GetFileImportLogListQuery(Guid EstateId, Guid? MerchantId, DateTime StartDate, DateTime EndDate) : IRequest>>; + public record GetFileImportLogListQuery(Guid EstateId, Guid? MerchantId, DateOnly StartDate, DateOnly EndDate) : IRequest>>; public record GetFileImportLogQuery(Guid EstateId, Guid? MerchantId, Guid FileImportLogId) : IRequest>; } diff --git a/EstateReportingAPI.BusinessLogic/Queries/SettlementQueries.cs b/EstateReportingAPI.BusinessLogic/Queries/SettlementQueries.cs index 04269f1..47d240d 100644 --- a/EstateReportingAPI.BusinessLogic/Queries/SettlementQueries.cs +++ b/EstateReportingAPI.BusinessLogic/Queries/SettlementQueries.cs @@ -7,5 +7,5 @@ namespace EstateReportingAPI.BusinessLogic.Queries; [ExcludeFromCodeCoverage] public record SettlementQueries { - public record TodaysSettlementQuery(Guid EstateId, DateTime ComparisonDate) : IRequest>; + public record TodaysSettlementQuery(Guid EstateId, DateOnly ComparisonDate) : IRequest>; } \ No newline at end of file diff --git a/EstateReportingAPI.BusinessLogic/Queries/TransactionQueries.cs b/EstateReportingAPI.BusinessLogic/Queries/TransactionQueries.cs index 770bbda..661549e 100644 --- a/EstateReportingAPI.BusinessLogic/Queries/TransactionQueries.cs +++ b/EstateReportingAPI.BusinessLogic/Queries/TransactionQueries.cs @@ -12,7 +12,7 @@ public record TodaysFailedSales(Guid EstateId, DateTime ComparisonDate, String R public record TransactionDetailReportQuery(Guid EstateId, TransactionDetailReportRequest Request) : IRequest>; public record TransactionSummaryByMerchantQuery(Guid EstateId, TransactionSummaryByMerchantRequest Request) : IRequest>; public record TransactionSummaryByOperatorQuery(Guid EstateId, TransactionSummaryByOperatorRequest Request) : IRequest>; - public record ProductPerformanceQuery(Guid EstateId, DateTime StartDate, DateTime EndDate, int PageNumber = 1, int PageSize = 50) : IRequest>; + public record ProductPerformanceQuery(Guid EstateId, DateOnly StartDate, DateOnly EndDate, int PageNumber = 1, int PageSize = 50) : IRequest>; public record TransactionMixSummaryQuery(Guid EstateId, TransactionMixSummaryRequest Request) : IRequest>; public record GetRecentActivityReceiptReportQuery(Guid EstateId, GetRecentActivityReceiptReportRequest Request) : IRequest>; public record TodaysSalesByHour(Guid estateId, DateTime comparisonDate) : IRequest>>; diff --git a/EstateReportingAPI.BusinessLogic/ReportQueryValidation.cs b/EstateReportingAPI.BusinessLogic/ReportQueryValidation.cs index fc563b4..40efcb6 100644 --- a/EstateReportingAPI.BusinessLogic/ReportQueryValidation.cs +++ b/EstateReportingAPI.BusinessLogic/ReportQueryValidation.cs @@ -5,15 +5,12 @@ namespace EstateReportingAPI.BusinessLogic; public static class ReportQueryValidation { - public static string? ValidateDateRange(DateTime startDate, DateTime endDate) + public static string? ValidateDateRange(DateOnly startDate, DateOnly endDate) { - DateTime start = startDate.Date; - DateTime end = endDate.Date; - - if (start > end) + if (startDate > endDate) return "startDate must be less than or equal to endDate."; - if ((end - start).TotalDays + 1 > ReportQueryLimits.MaxDateRangeDays) + if ((endDate.DayNumber - startDate.DayNumber) + 1 > ReportQueryLimits.MaxDateRangeDays) return "date range must not exceed 30 inclusive calendar days."; return null; diff --git a/EstateReportingAPI.BusinessLogic/Services/EstateReportingService.cs b/EstateReportingAPI.BusinessLogic/Services/EstateReportingService.cs index dbe6025..bfbb742 100644 --- a/EstateReportingAPI.BusinessLogic/Services/EstateReportingService.cs +++ b/EstateReportingAPI.BusinessLogic/Services/EstateReportingService.cs @@ -34,9 +34,9 @@ public async Task>> GetCalendarComparisonDates(CalendarQue using ResolvedDbContext? resolvedContext = Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString()); await using EstateManagementContext context = resolvedContext.Context; - DateTime today = DatePolicy.Today.ToDateTime(TimeOnly.MinValue); - DateTime startDate = today.AddYears(-1); - DateTime endDate = today.AddDays(-1); // yesterday + DateOnly today = DatePolicy.Today; + DateOnly startDate = today.AddYears(-1); + DateOnly endDate = today.AddDays(-1); // yesterday var result = await ReportingQueryExecutor.ToListAsync(context.Calendar.Where(c => c.Date >= startDate && c.Date <= endDate).OrderByDescending(c => c.Date), cancellationToken, "Error retrieving calendar comparison dates"); @@ -73,7 +73,7 @@ public async Task>> GetCalendarDates(CalendarQueries.GetAl await using EstateManagementContext context = resolvedContext.Context; - var result = await ReportingQueryExecutor.ToListAsync(context.Calendar.Where(c => c.Date <= DatePolicy.Today.ToDateTime(TimeOnly.MinValue)), cancellationToken, "Error retrieving calendar dates"); + var result = await ReportingQueryExecutor.ToListAsync(context.Calendar.Where(c => c.Date <= DatePolicy.Today), cancellationToken, "Error retrieving calendar dates"); if (result.IsFailed) return ResultHelpers.CreateFailure(result); @@ -104,7 +104,7 @@ public async Task>> GetCalendarYears(CalendarQueries.GetYears using ResolvedDbContext? resolvedContext = Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString()); await using EstateManagementContext context = resolvedContext.Context; - var result = await ReportingQueryExecutor.ToListAsync(context.Calendar.Where(c => c.Date <= DatePolicy.Today.ToDateTime(TimeOnly.MinValue)).GroupBy(c => c.Year).Select(y => y.Key), cancellationToken, "Error retrieving calendar years"); + var result = await ReportingQueryExecutor.ToListAsync(context.Calendar.Where(c => c.Date <= DatePolicy.Today).GroupBy(c => c.Year).Select(y => y.Key), cancellationToken, "Error retrieving calendar years"); if (result.IsFailed) return ResultHelpers.CreateFailure(result); diff --git a/EstateReportingAPI.BusinessLogic/Services/FileImportReportingService.cs b/EstateReportingAPI.BusinessLogic/Services/FileImportReportingService.cs index cfaca40..341d072 100644 --- a/EstateReportingAPI.BusinessLogic/Services/FileImportReportingService.cs +++ b/EstateReportingAPI.BusinessLogic/Services/FileImportReportingService.cs @@ -33,7 +33,7 @@ from esu in esuJoin.DefaultIfEmpty() join m in context.Merchants on f.MerchantId equals m.MerchantId into mJoin from m in mJoin.DefaultIfEmpty() join fl in context.FileLines on f.FileId equals fl.FileId - where fil.ImportLogDate >= request.StartDate.Date && fil.ImportLogDate < request.EndDate.Date.AddDays(1) + where fil.ImportLogDate >= request.StartDate && fil.ImportLogDate < request.EndDate.AddDays(1) && (request.MerchantId == null || f.MerchantId == request.MerchantId) select new FileImportFlatData { FileImportLogId = fil.FileImportLogId, @@ -186,11 +186,11 @@ join o in context.Operators on c.OperatorId equals o.OperatorId } private sealed class FileImportFlatData { public Guid FileImportLogId { get; init; } - public DateTime ImportLogDateTime { get; init; } + public DateTimeOffset ImportLogDateTime { get; init; } public Guid FileId { get; init; } public string? FileName { get; init; } public Guid? FileProfileId { get; init; } - public DateTime DateTimeUploaded { get; init; } + public DateTimeOffset DateTimeUploaded { get; init; } public Guid UserId { get; init; } public string? UploadedBy { get; init; } public Guid MerchantId { get; init; } diff --git a/EstateReportingAPI.BusinessLogic/Services/SettlementReportingService.cs b/EstateReportingAPI.BusinessLogic/Services/SettlementReportingService.cs index 498620e..a69fcb3 100644 --- a/EstateReportingAPI.BusinessLogic/Services/SettlementReportingService.cs +++ b/EstateReportingAPI.BusinessLogic/Services/SettlementReportingService.cs @@ -28,7 +28,7 @@ public async Task> GetTodaysSettlement(SettlementQuerie using ResolvedDbContext? resolvedContext = Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString()); await using EstateManagementContext context = resolvedContext.Context; - IQueryable todaySettlementData = this.BuildTodaySettlementQuery(context, DatePolicy.Today.ToDateTime(TimeOnly.MinValue)); + IQueryable todaySettlementData = this.BuildTodaySettlementQuery(context, DatePolicy.Today); IQueryable comparisonSettlementData = this.BuildComparisonSettlementQuery(context, request.ComparisonDate); DatabaseProjections.SettlementGroupProjection todaySettlement = await this.GetSettlementSummary(todaySettlementData, cancellationToken); @@ -87,14 +87,14 @@ public async Task> GetTodaysSettlement(SettlementQuerie } private IQueryable BuildTodaySettlementQuery(EstateManagementContext context, - DateTime settlementDate) { + DateOnly settlementDate) { IQueryable settlementData = from s in context.Settlements join f in context.MerchantSettlementFees on s.SettlementId equals f.SettlementId join t in context.TodayTransactions on f.TransactionId equals t.TransactionId where s.SettlementDate == settlementDate select new DatabaseProjections.TodaySettlementTransactionProjection { Fee = f, Txn = t }; return settlementData; } private IQueryable BuildComparisonSettlementQuery(EstateManagementContext context, - DateTime settlementDate) { - IQueryable settlementData = from s in context.Settlements join f in context.MerchantSettlementFees on s.SettlementId equals f.SettlementId join t in context.TransactionHistory on f.TransactionId equals t.TransactionId where s.SettlementDate == settlementDate.Date select new DatabaseProjections.ComparisonSettlementTransactionProjection { Fee = f, Txn = t }; + DateOnly settlementDate) { + IQueryable settlementData = from s in context.Settlements join f in context.MerchantSettlementFees on s.SettlementId equals f.SettlementId join t in context.TransactionHistory on f.TransactionId equals t.TransactionId where s.SettlementDate == settlementDate select new DatabaseProjections.ComparisonSettlementTransactionProjection { Fee = f, Txn = t }; return settlementData; } } diff --git a/EstateReportingAPI.BusinessLogic/Services/TransactionReportingService.cs b/EstateReportingAPI.BusinessLogic/Services/TransactionReportingService.cs index 287d8f5..d7a5c38 100644 --- a/EstateReportingAPI.BusinessLogic/Services/TransactionReportingService.cs +++ b/EstateReportingAPI.BusinessLogic/Services/TransactionReportingService.cs @@ -168,7 +168,7 @@ from msf in msfJoin.DefaultIfEmpty() // left join Settlements (msf may be null) join s in context.Settlements on msf.SettlementId equals s.SettlementId into sJoin from s in sJoin.DefaultIfEmpty() - where t.TransactionType != "Logon" && t.TransactionDate >= request.StartDate.Date && t.TransactionDate < request.EndDate.Date.AddDays(1) + where t.TransactionType != "Logon" && t.TransactionDate >= request.StartDate && t.TransactionDate < request.EndDate.AddDays(1) select new TransactionDetailQueryResult { TransactionId = t.TransactionId, TransactionDateTime = t.TransactionDateTime, @@ -336,12 +336,12 @@ private static async Task> LoadMerchantSummary } private static IQueryable BuildMerchantTransactionBaseQuery(EstateManagementContext context, - DateTime startDate, - DateTime endDate) { + DateOnly startDate, + DateOnly endDate) { return 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 >= startDate.Date && t.TransactionDate < endDate.Date.AddDays(1) + where t.TransactionType == "Sale" && t.TransactionDate >= startDate && t.TransactionDate < endDate.AddDays(1) group t by new { t.MerchantId, m.MerchantReportingId, MerchantName = m.Name, t.OperatorId, o.OperatorReportingId } into g select new MerchantTransactionGroupProjection { @@ -443,7 +443,7 @@ private static IQueryable BuildOperatorTransactionBaseQ 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) + where t.TransactionType == "Sale" && t.TransactionDate >= request.Request.StartDate && t.TransactionDate < request.Request.EndDate.AddDays(1) group t by new { t.MerchantId, m.MerchantReportingId, @@ -558,7 +558,7 @@ private static async Task> LoadProductPerfo TransactionQueries.ProductPerformanceQuery request, CancellationToken cancellationToken) { IQueryable grandTotalAmountQuery = from t in context.Transactions - where t.TransactionType == "Sale" && t.TransactionDate >= request.StartDate.Date && t.TransactionDate < request.EndDate.Date.AddDays(1) + where t.TransactionType == "Sale" && t.TransactionDate >= request.StartDate && t.TransactionDate < request.EndDate.AddDays(1) select t.TransactionAmount; Result grandTotalAmountResult = await ReportingQueryExecutor.SumAsync(grandTotalAmountQuery, cancellationToken); if (grandTotalAmountResult.IsFailed) @@ -755,7 +755,7 @@ private static IQueryable BuildRecentActivityR join m in context.Merchants on t.MerchantId equals m.MerchantId join o in context.Operators on t.OperatorId equals o.OperatorId join cp in context.ContractProducts on new { t.ContractProductId, t.ContractId } equals new { cp.ContractProductId, cp.ContractId } - where t.TransactionDate == parameters.ReportDate.ToDateTime(TimeOnly.MinValue) + where t.TransactionDate == parameters.ReportDate select new RecentActivityReceiptQueryResult { TransactionId = t.TransactionId, TransactionDateTime = t.TransactionDateTime, @@ -833,13 +833,13 @@ private static RecentActivityReceiptItemDto MapRecentActivityReceiptItem(RecentA } private static IQueryable BuildProductPerformanceQuery(EstateManagementContext context, - DateTime startDate, - DateTime endDate, + DateOnly startDate, + DateOnly endDate, decimal grandTotalAmount) { return from t in context.Transactions join cp in context.ContractProducts on new { t.ContractProductId, t.ContractId } equals new { cp.ContractProductId, cp.ContractId } join c in context.Contracts on t.ContractId equals c.ContractId - where t.TransactionType == "Sale" && t.TransactionDate >= startDate.Date && t.TransactionDate < endDate.Date.AddDays(1) + where t.TransactionType == "Sale" && t.TransactionDate >= startDate && t.TransactionDate < endDate.AddDays(1) group t by new { cp.ProductName, cp.ContractProductId, cp.ContractProductReportingId, c.ContractId, c.ContractReportingId } into g select new ProductPerformanceItemData { @@ -929,8 +929,8 @@ private static TransactionMixSummaryResponse BuildTransactionMixSummaryResponse( { return new TransactionMixSummaryResponse { - FromDate = DateOnly.FromDateTime(request.StartDate), - ToDate = DateOnly.FromDateTime(request.EndDate), + FromDate = request.StartDate, + ToDate = request.EndDate, Breakdown = request.Breakdown, Measure = request.Measure, TotalCount = totalCount, @@ -1024,11 +1024,9 @@ public async Task> GetMerchantDa using ResolvedDbContext? resolvedContext = Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString()); await using EstateManagementContext context = resolvedContext.Context; - DateTime startDate = request.Request.StartDate.Date; - DateTime endDate = request.Request.EndDate.Date; - int dayCount = Math.Max((endDate - startDate).Days + 1, 1); + int dayCount = Math.Max((request.Request.EndDate.DayNumber - request.Request.StartDate.DayNumber) + 1, 1); - Result> groupedTransactionsResult = await LoadMerchantDailyPerformanceGroups(context, request, startDate, endDate, cancellationToken); + Result> groupedTransactionsResult = await LoadMerchantDailyPerformanceGroups(context, request, request.Request.StartDate, request.Request.EndDate, cancellationToken); if (groupedTransactionsResult.IsFailed) return ResultHelpers.CreateFailure(groupedTransactionsResult); @@ -1039,7 +1037,7 @@ public async Task> GetMerchantDa List metrics = BuildMerchantDailyPerformanceMetrics(groupedTransactions, dayCount); - Result> recentSalesResult = await LoadMerchantDailyPerformanceRecentSales(context, request, startDate, endDate, cancellationToken); + Result> recentSalesResult = await LoadMerchantDailyPerformanceRecentSales(context, request, request.Request.StartDate, request.Request.EndDate, cancellationToken); if (recentSalesResult.IsFailed) return ResultHelpers.CreateFailure(recentSalesResult); @@ -1050,21 +1048,21 @@ public async Task> GetMerchantDa } private IQueryable BuildTodaySalesQuery(EstateManagementContext context, DateTime now) { - return from t in context.TodayTransactions where t.IsAuthorised && t.TransactionType == "Sale" && t.TransactionDate == now.Date && t.TransactionTime <= now.TimeOfDay select t; + return from t in context.TodayTransactions where t.IsAuthorised && t.TransactionType == "Sale" && t.TransactionDate == DateOnly.FromDateTime(now.Date) && t.TransactionTime <= now.TimeOfDay select t; } private IQueryable BuildTodaysFailedSalesQuery(EstateManagementContext context, String responseCode, DateTime now) { return from t in context.TodayTransactions - where t.IsAuthorised == false && t.TransactionType == "Sale" && t.TransactionDate == now.Date && t.TransactionTime <= now.TimeOfDay && t.ResponseCode == responseCode + where t.IsAuthorised == false && t.TransactionType == "Sale" && t.TransactionDate == DateOnly.FromDateTime(now.Date) && t.TransactionTime <= now.TimeOfDay && t.ResponseCode == responseCode select t.TransactionAmount; } private IQueryable BuildComparisonSalesQuery(EstateManagementContext context, DateTime comparisonDate, DateTime now) { - return from t in context.TransactionHistory where t.IsAuthorised && t.TransactionType == "Sale" && t.TransactionDate == comparisonDate.Date && t.TransactionTime <= now.TimeOfDay select t; + return from t in context.TransactionHistory where t.IsAuthorised && t.TransactionType == "Sale" && t.TransactionDate == DateOnly.FromDateTime(comparisonDate.Date) && t.TransactionTime <= now.TimeOfDay select t; } private IQueryable BuildComparisonFailedSalesQuery(EstateManagementContext context, @@ -1072,7 +1070,7 @@ private IQueryable BuildComparisonFailedSalesQuery(EstateManagementCont String responseCode, DateTime now) { return from t in context.TransactionHistory - where t.IsAuthorised == false && t.TransactionType == "Sale" && t.TransactionDate == comparisonDate.Date && t.TransactionTime <= now.TimeOfDay && t.ResponseCode == responseCode + where t.IsAuthorised == false && t.TransactionType == "Sale" && t.TransactionDate == DateOnly.FromDateTime(comparisonDate.Date) && t.TransactionTime <= now.TimeOfDay && t.ResponseCode == responseCode select t.TransactionAmount; } @@ -1117,7 +1115,7 @@ private sealed class MerchantDailyPerformanceRecentSaleProjection { public String Operator { get; init; } public string Status { get; init; } public decimal Amount { get; init; } - public DateTime TransactionDateTime { get; init; } + public DateTimeOffset TransactionDateTime { get; init; } } private static MerchantDailyPerformanceSummaryResponse BuildEmptyMerchantDailyPerformanceSummaryResponse() { @@ -1195,8 +1193,8 @@ private static List BuildMerchantDailyPerformanceMetrics(List>> LoadMerchantDailyPerformanceGroups(EstateManagementContext context, TransactionQueries.MerchantDailyPerformanceSummaryQuery request, - DateTime startDate, - DateTime endDate, + DateOnly startDate, + DateOnly endDate, CancellationToken cancellationToken) { IQueryable query = from t in context.Transactions @@ -1206,7 +1204,7 @@ join op in context.Operators on t.OperatorId equals op.OperatorId into opJoin from op in opJoin.DefaultIfEmpty() where t.TransactionType == "Sale" && t.TransactionDate >= startDate - && t.TransactionDate < endDate.Date.AddDays(1) + && t.TransactionDate < endDate.AddDays(1) && m.MerchantReportingId == request.Request.MerchantReportingId group t by new { @@ -1231,8 +1229,8 @@ into g private async Task>> LoadMerchantDailyPerformanceRecentSales(EstateManagementContext context, TransactionQueries.MerchantDailyPerformanceSummaryQuery request, - DateTime startDate, - DateTime endDate, + DateOnly startDate, + DateOnly endDate, CancellationToken cancellationToken) { IQueryable query = (from t in context.Transactions @@ -1242,7 +1240,7 @@ join op in context.Operators on t.OperatorId equals op.OperatorId into opJoin from op in opJoin.DefaultIfEmpty() where t.TransactionType == "Sale" && t.TransactionDate >= startDate - && t.TransactionDate < endDate.Date.AddDays(1) + && t.TransactionDate < endDate.AddDays(1) && m.MerchantReportingId == request.Request.MerchantReportingId orderby t.TransactionDateTime descending, t.TransactionId descending select new MerchantDailyPerformanceRecentSaleProjection @@ -1272,7 +1270,7 @@ private static List MapMerchantDailyPerformanceRecentSales private sealed class RecentActivityReceiptQueryResult { public Guid TransactionId { get; init; } - public DateTime TransactionDateTime { get; init; } + public DateTimeOffset TransactionDateTime { get; init; } public int MerchantReportingId { get; init; } public string Reference { get; init; } public string? TransactionType { get; init; } @@ -1293,7 +1291,7 @@ private sealed class RecentActivityReceiptRequestParameters { private sealed class TransactionDetailQueryResult { public Guid TransactionId { get; init; } - public DateTime TransactionDateTime { get; init; } + public DateTimeOffset TransactionDateTime { get; init; } public Guid MerchantId { get; init; } public int MerchantReportingId { get; init; } public string? MerchantName { get; init; } diff --git a/EstateReportingAPI.DataTrasferObjects/Contract.cs b/EstateReportingAPI.DataTrasferObjects/Contract.cs index 65dd340..60f1c38 100644 --- a/EstateReportingAPI.DataTrasferObjects/Contract.cs +++ b/EstateReportingAPI.DataTrasferObjects/Contract.cs @@ -103,7 +103,7 @@ public class EstateUser /// The email address value. public string? EmailAddress { get; set; } /// The created date time value. - public DateTime CreatedDateTime { get; set; } + public DateTimeOffset CreatedDateTime { get; set; } } /// API data model describing estate operator information. diff --git a/EstateReportingAPI.DataTrasferObjects/Merchant.cs b/EstateReportingAPI.DataTrasferObjects/Merchant.cs index 7ead333..104a673 100644 --- a/EstateReportingAPI.DataTrasferObjects/Merchant.cs +++ b/EstateReportingAPI.DataTrasferObjects/Merchant.cs @@ -21,7 +21,7 @@ public class Merchant{ /// The settlement schedule value. public Int32 SettlementSchedule { get; set; } /// The created date time value. - public DateTime CreatedDateTime { get; set; } + public DateTimeOffset CreatedDateTime { get; set; } /// The address id value. diff --git a/EstateReportingAPI.IntegrationTests/DatabaseHelper.cs b/EstateReportingAPI.IntegrationTests/DatabaseHelper.cs index 6307f96..2c48ec2 100644 --- a/EstateReportingAPI.IntegrationTests/DatabaseHelper.cs +++ b/EstateReportingAPI.IntegrationTests/DatabaseHelper.cs @@ -80,7 +80,7 @@ public async Task AddFileImportLog(Guid estateId, DateTime importDate){ FileImportLogId = Guid.NewGuid(), EstateId = estateId, ImportLogDateTime = importDate, - ImportLogDate = importDate.Date + ImportLogDate = DateOnly.FromDateTime(importDate.Date) }; await this.Context.AddAsync(fil); @@ -264,7 +264,7 @@ public async Task AddTransactionOld(DateTime dateTime, Transaction transaction = new Transaction { MerchantId = merchant.MerchantId, - TransactionDate = dateTime.Date, + TransactionDate = DateOnly.FromDateTime(dateTime.Date), TransactionDateTime = dateTime, IsCompleted = true, AuthorisationCode = "ABCD1234", @@ -353,7 +353,7 @@ public async Task BuildTransactionX(DateTime dateTime, Transaction transaction = new Transaction { MerchantId = merchantId, - TransactionDate = dateTime.Date, + TransactionDate = DateOnly.FromDateTime(dateTime.Date), TransactionDateTime = dateTime, IsCompleted = true, AuthorisationCode = "ABCD1234", @@ -663,7 +663,7 @@ public async Task AddMerchants(String estateName, EstateId = estate.EstateId, MerchantId = Guid.NewGuid(), Name = merchant1.merchantName, - LastSaleDate = merchant1.lastSaleDateTime.Date, + LastSaleDate = DateOnly.FromDateTime(merchant1.lastSaleDateTime.Date), LastSaleDateTime = merchant1.lastSaleDateTime }; await this.Context.Merchants.AddAsync(merchant); @@ -769,7 +769,7 @@ public async Task AddMerchantSettlementFee(Guid settlementId, DateTime feeCalcul IsAuthorised = true, IsCompleted = true, TransactionAmount = 1.00m, - TransactionDate = feeCalculatedDateTime.Date, + TransactionDate = DateOnly.FromDateTime(feeCalculatedDateTime.Date), TransactionDateTime = feeCalculatedDateTime, TransactionSource = 1, TransactionTime = feeCalculatedDateTime.TimeOfDay, @@ -853,7 +853,7 @@ public async Task AddSettlementRecordWithFees(DateTime dateTime, EstateId = estateId, MerchantId = merchantId, ProcessingStartedDateTIme = dateTime, - SettlementDate = dateTime, + SettlementDate = DateOnly.FromDateTime(dateTime), SettlementId = Guid.NewGuid(), }; await this.Context.Settlements.AddAsync(settlementRecord, CancellationToken.None); diff --git a/EstateReportingAPI.IntegrationTests/Extensions.cs b/EstateReportingAPI.IntegrationTests/Extensions.cs index a919cad..22e1c33 100644 --- a/EstateReportingAPI.IntegrationTests/Extensions.cs +++ b/EstateReportingAPI.IntegrationTests/Extensions.cs @@ -11,7 +11,7 @@ namespace EstateReportingAPI.IntegrationTests public static class Extensions{ public static Calendar ToCalendar(this DateTime date){ return new Calendar{ - Date = date, + Date = DateOnly.FromDateTime(date), DayOfWeek = date.DayOfWeek.ToString(), DayOfWeekShort = date.DayOfWeek.ToString().Substring(0, 3), YearWeekNumber = $"{date.Year}{date.GetWeekNumber().ToString().PadLeft(2, '0')}", diff --git a/EstateReportingAPI.IntegrationTests/FileImportLogsEndpointTests.cs b/EstateReportingAPI.IntegrationTests/FileImportLogsEndpointTests.cs index 26331bb..c4dfae7 100644 --- a/EstateReportingAPI.IntegrationTests/FileImportLogsEndpointTests.cs +++ b/EstateReportingAPI.IntegrationTests/FileImportLogsEndpointTests.cs @@ -40,12 +40,12 @@ private void AssertFileDetailsMatchesSource(FileDetails actual, string uploadedBy, Guid merchantId, string merchantName, - DateTime uploadedAt) + DateTimeOffset uploadedAt) { actual.FileId.ShouldBe(fileId); actual.FileName.ShouldBe(fileName); actual.FileProfile.ShouldBe(fileProfileId.ToString()); - actual.DateTimeUploaded.ShouldBe(ToUkDateTimeOffset(uploadedAt), TimeSpan.FromSeconds(1)); + actual.DateTimeUploaded.ShouldBe(uploadedAt, TimeSpan.FromSeconds(1)); actual.UserId.ShouldBe(userId); actual.UploadedBy.ShouldBe(uploadedBy); actual.MerchantId.ShouldBe(merchantId); @@ -98,7 +98,7 @@ public async Task FileImportEndpoint_GetFileImportLogs_WithMerchantFilter_Return var match = list.Single(); match.FileImportLogId.ShouldBe(sourceLog.FileImportLogId); - match.ImportLogDateTime.ShouldBe(ToUkDateTimeOffset(sourceLog.ImportLogDateTime), TimeSpan.FromSeconds(1)); + match.ImportLogDateTime.ShouldBe(sourceLog.ImportLogDateTime, TimeSpan.FromSeconds(1)); match.FileDetailsList.Count.ShouldBe(1); var fileDetail = match.FileDetailsList.Single(); @@ -146,7 +146,7 @@ public async Task FileImportEndpoint_GetFileImportLog_WithMerchantFilter_Returns var sourceLine = this.context.FileLines.Single(x => x.FileId == fileId); item.FileImportLogId.ShouldBe(sourceLog.FileImportLogId); - item.ImportLogDateTime.ShouldBe(ToUkDateTimeOffset(sourceLog.ImportLogDateTime), TimeSpan.FromSeconds(1)); + item.ImportLogDateTime.ShouldBe(sourceLog.ImportLogDateTime, TimeSpan.FromSeconds(1)); item.FileDetailsList.Count.ShouldBe(1); var fileDetail = item.FileDetailsList.Single(); @@ -192,7 +192,7 @@ public async Task FileImportEndpoint_GetFileImportLog_ReturnsInsertedData() var sourceLine = this.context.FileLines.Single(x => x.FileId == fileId); item.FileImportLogId.ShouldBe(sourceLog.FileImportLogId); - item.ImportLogDateTime.ShouldBe(ToUkDateTimeOffset(sourceLog.ImportLogDateTime), TimeSpan.FromSeconds(1)); + item.ImportLogDateTime.ShouldBe(sourceLog.ImportLogDateTime, TimeSpan.FromSeconds(1)); item.FileDetailsList.Count.ShouldBe(1); var fileDetail = item.FileDetailsList.Single(); @@ -277,7 +277,7 @@ public async Task FileImportEndpoint_GetFileImportLogs_ReturnsInsertedData() var match = list.Single(); match.FileImportLogId.ShouldBe(sourceLog.FileImportLogId); - match.ImportLogDateTime.ShouldBe(ToUkDateTimeOffset(sourceLog.ImportLogDateTime), TimeSpan.FromSeconds(1)); + match.ImportLogDateTime.ShouldBe(sourceLog.ImportLogDateTime, TimeSpan.FromSeconds(1)); match.FileDetailsList.Count.ShouldBe(1); var fileDetail = match.FileDetailsList.Single(); diff --git a/EstateReportingAPI.IntegrationTests/TransactionMixSummaryEndpointTests.cs b/EstateReportingAPI.IntegrationTests/TransactionMixSummaryEndpointTests.cs index 6d87fa7..9e2ef9c 100644 --- a/EstateReportingAPI.IntegrationTests/TransactionMixSummaryEndpointTests.cs +++ b/EstateReportingAPI.IntegrationTests/TransactionMixSummaryEndpointTests.cs @@ -32,7 +32,7 @@ private void AssertTransactionMixSummaryTransactionMatches(TransactionMixSummary var product = this.context.ContractProducts.Single(p => p.ContractProductId == source.ContractProductId && p.ContractId == source.ContractId); actual.Id.ShouldBe(source.TransactionId); - actual.DateTime.ShouldBe(ToUkDateTimeOffset(source.TransactionDateTime)); + actual.DateTime.ShouldBe(source.TransactionDateTime); actual.Merchant.ShouldBe(merchant.Name); actual.MerchantId.ShouldBe(merchant.MerchantId); actual.MerchantReportingId.ShouldBe(merchant.MerchantReportingId); diff --git a/EstateReportingAPI.IntegrationTests/TransactionsEndpointTests.cs b/EstateReportingAPI.IntegrationTests/TransactionsEndpointTests.cs index 06f2636..f3614c6 100644 --- a/EstateReportingAPI.IntegrationTests/TransactionsEndpointTests.cs +++ b/EstateReportingAPI.IntegrationTests/TransactionsEndpointTests.cs @@ -90,7 +90,7 @@ private static void AssertDrillDownTransactionMatches(DrillDownTransaction actua actual.Product.ShouldBe(expectedProduct); actual.Status.ShouldBe(source.IsAuthorised ? "Successful" : "Failed"); actual.Amount.ShouldBe(source.TransactionAmount); - actual.TransactionDateTime.ShouldBe(ToUkDateTimeOffset(source.TransactionDateTime)); + actual.TransactionDateTime.ShouldBe(source.TransactionDateTime); } private static void AssertRecentActivityReceiptItemMatches(JsonElement actual, @@ -104,7 +104,7 @@ private static void AssertRecentActivityReceiptItemMatches(JsonElement actual, GetPropertyCaseInsensitive(actual, "operator").GetString().ShouldBe(expectedOperator); GetPropertyCaseInsensitive(actual, "status").GetString().ShouldBe(source.IsAuthorised ? "Successful" : "Failed"); GetPropertyCaseInsensitive(actual, "amount").GetDecimal().ShouldBe(source.TransactionAmount); - DateTimeOffset.Parse(GetPropertyCaseInsensitive(actual, "transactionDateTime").GetString()!).ShouldBe(ToUkDateTimeOffset(source.TransactionDateTime)); + DateTimeOffset.Parse(GetPropertyCaseInsensitive(actual, "transactionDateTime").GetString()!).ShouldBe(source.TransactionDateTime); GetPropertyCaseInsensitive(actual, "receiptReference").GetString().ShouldBe(expectedReceiptReference); } @@ -114,7 +114,7 @@ private void AssertTransactionDetailMatches(TransactionDetail actual, Transactio var product = this.context.ContractProducts.Single(p => p.ContractProductId == source.ContractProductId && p.ContractId == source.ContractId); actual.Id.ShouldBe(source.TransactionId); - actual.DateTime.ShouldBe(ToUkDateTimeOffset(source.TransactionDateTime)); + actual.DateTime.ShouldBe(source.TransactionDateTime); actual.Merchant.ShouldBe(merchant.Name); actual.MerchantId.ShouldBe(merchant.MerchantId); actual.MerchantReportingId.ShouldBe(merchant.MerchantReportingId); @@ -1210,16 +1210,16 @@ public async Task TransactionsEndpoint_TodaysSalesByHour_SummaryDataReturned() await this.helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); var todaysReadModelRows = await this.context.TodayTransactions - .Where(t => t.TransactionDate == todaysDateTime.Date) - .Select(t => new { t.TransactionDateTime, t.Hour }) - .ToListAsync(); + .Where(t => t.TransactionDate == DateOnly.FromDateTime(todaysDateTime.Date)) + .Select(t => new { t.TransactionDateTime, t.Hour }) + .ToListAsync(); todaysReadModelRows.ShouldNotBeEmpty(); todaysReadModelRows.ShouldAllBe(x => x.Hour == x.TransactionDateTime.Hour); var comparisonReadModelRows = await this.context.TransactionHistory - .Where(t => t.TransactionDate == comparisonDate.Date) - .Select(t => new { t.TransactionDateTime, t.Hour }) - .ToListAsync(); + .Where(t => t.TransactionDate == DateOnly.FromDateTime(comparisonDate.Date)) + .Select(t => new { t.TransactionDateTime, t.Hour }) + .ToListAsync(); comparisonReadModelRows.ShouldNotBeEmpty(); comparisonReadModelRows.ShouldAllBe(x => x.Hour == x.TransactionDateTime.Hour); diff --git a/EstateReportingAPI.Models/Calendar.cs b/EstateReportingAPI.Models/Calendar.cs index 7d03d91..73c4433 100644 --- a/EstateReportingAPI.Models/Calendar.cs +++ b/EstateReportingAPI.Models/Calendar.cs @@ -3,7 +3,7 @@ public class Calendar{ #region Properties - public DateTime Date{ get; set; } + public DateOnly Date { get; set; } public String DayOfWeek{ get; set; } diff --git a/EstateReportingAPI.Models/EstateUser.cs b/EstateReportingAPI.Models/EstateUser.cs index f161cd4..e63fd01 100644 --- a/EstateReportingAPI.Models/EstateUser.cs +++ b/EstateReportingAPI.Models/EstateUser.cs @@ -4,5 +4,5 @@ public class EstateUser { public Guid UserId { get; set; } public string? EmailAddress { get; set; } - public DateTime CreatedDateTime { get; set; } + public DateTimeOffset CreatedDateTime { get; set; } } \ No newline at end of file diff --git a/EstateReportingAPI.Models/FileDetails.cs b/EstateReportingAPI.Models/FileDetails.cs index 5f502d1..fa11150 100644 --- a/EstateReportingAPI.Models/FileDetails.cs +++ b/EstateReportingAPI.Models/FileDetails.cs @@ -5,7 +5,7 @@ public class FileDetails public Guid FileId { get; set; } public string FileName { get; set; } public string FileProfile { get; set; } - public DateTime DateTimeUploaded { get; set; } + public DateTimeOffset DateTimeUploaded { get; set; } public Guid UserId { get; set; } public string UploadedBy { get; set; } public Guid MerchantId { get; set; } diff --git a/EstateReportingAPI.Models/FileImportLog.cs b/EstateReportingAPI.Models/FileImportLog.cs index f25ebe9..05e60f6 100644 --- a/EstateReportingAPI.Models/FileImportLog.cs +++ b/EstateReportingAPI.Models/FileImportLog.cs @@ -3,6 +3,6 @@ public class FileImportLog { public Guid FileImportLogId { get; set; } - public DateTime ImportLogDateTime { get; set; } + public DateTimeOffset ImportLogDateTime { get; set; } public List FileDetailsList { get; set; } } \ No newline at end of file diff --git a/EstateReportingAPI.Models/GetRecentActivityReceiptReportResponse.cs b/EstateReportingAPI.Models/GetRecentActivityReceiptReportResponse.cs index 3ed5eb7..13b78ec 100644 --- a/EstateReportingAPI.Models/GetRecentActivityReceiptReportResponse.cs +++ b/EstateReportingAPI.Models/GetRecentActivityReceiptReportResponse.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; - namespace EstateReportingAPI.Models; public class GetRecentActivityReceiptReportResponse @@ -18,6 +16,6 @@ public class RecentActivityReceiptItemDto public string? Operator { get; set; } public string? Status { get; set; } public decimal Amount { get; set; } - public DateTime TransactionDateTime { get; set; } + public DateTimeOffset TransactionDateTime { get; set; } public string? ReceiptReference { get; set; } } diff --git a/EstateReportingAPI.Models/Merchant.cs b/EstateReportingAPI.Models/Merchant.cs index 9aec326..e23ef78 100644 --- a/EstateReportingAPI.Models/Merchant.cs +++ b/EstateReportingAPI.Models/Merchant.cs @@ -9,7 +9,7 @@ public class Merchant public String Reference { get; set; } public Decimal Balance { get; set; } public Int32 SettlementSchedule { get; set; } - public DateTime CreatedDateTime { get; set; } + public DateTimeOffset CreatedDateTime { get; set; } public Guid AddressId { get; set; } public String AddressLine1 { get; set; } diff --git a/EstateReportingAPI.Models/MerchantDailyPerformanceSummaryRequest.cs b/EstateReportingAPI.Models/MerchantDailyPerformanceSummaryRequest.cs index db6b03a..b939c32 100644 --- a/EstateReportingAPI.Models/MerchantDailyPerformanceSummaryRequest.cs +++ b/EstateReportingAPI.Models/MerchantDailyPerformanceSummaryRequest.cs @@ -7,8 +7,8 @@ namespace EstateReportingAPI.Models public class MerchantDailyPerformanceSummaryRequest { public Int32 MerchantReportingId { get; set; } - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } + public DateOnly StartDate { get; set; } + public DateOnly EndDate { get; set; } } public class MerchantDailyPerformanceSummaryResponse { @@ -39,6 +39,6 @@ public class DrillDownTransaction { public Decimal Amount { get; set; } - public DateTime TransactionDateTime { get; set; } + public DateTimeOffset TransactionDateTime { get; set; } } } diff --git a/EstateReportingAPI.Models/TransactionDetail.cs b/EstateReportingAPI.Models/TransactionDetail.cs index ed8328f..5ef1ac9 100644 --- a/EstateReportingAPI.Models/TransactionDetail.cs +++ b/EstateReportingAPI.Models/TransactionDetail.cs @@ -2,7 +2,7 @@ public class TransactionDetail { public Guid Id { get; set; } - public DateTime DateTime { get; set; } + public DateTimeOffset DateTime { get; set; } public String Merchant { get; set; } public Guid MerchantId { get; set; } public Int32 MerchantReportingId { get; set; } diff --git a/EstateReportingAPI.Models/TransactionDetailReportRequest.cs b/EstateReportingAPI.Models/TransactionDetailReportRequest.cs index 9f2a6ca..012d15c 100644 --- a/EstateReportingAPI.Models/TransactionDetailReportRequest.cs +++ b/EstateReportingAPI.Models/TransactionDetailReportRequest.cs @@ -5,8 +5,8 @@ public class TransactionDetailReportRequest public List? Operators { get; set; } public List? Merchants { get; set; } public List? Products { get; set; } - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } + public DateOnly StartDate { get; set; } + public DateOnly EndDate { get; set; } public int PageNumber { get; set; } = 1; public int PageSize { get; set; } = 50; } diff --git a/EstateReportingAPI.Models/TransactionMixSummaryRequest.cs b/EstateReportingAPI.Models/TransactionMixSummaryRequest.cs index f669476..a4fbd4d 100644 --- a/EstateReportingAPI.Models/TransactionMixSummaryRequest.cs +++ b/EstateReportingAPI.Models/TransactionMixSummaryRequest.cs @@ -21,8 +21,8 @@ public enum TransactionMixMeasure public class TransactionMixSummaryRequest { public int? MerchantReportingId { get; set; } - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } + public DateOnly StartDate { get; set; } + public DateOnly EndDate { get; set; } public TransactionMixBreakdown Breakdown { get; set; } public TransactionMixMeasure Measure { get; set; } public int TopN { get; set; } = 5; diff --git a/EstateReportingAPI.Models/TransactionMixSummaryResponse.cs b/EstateReportingAPI.Models/TransactionMixSummaryResponse.cs index 8dfdb81..2c9c167 100644 --- a/EstateReportingAPI.Models/TransactionMixSummaryResponse.cs +++ b/EstateReportingAPI.Models/TransactionMixSummaryResponse.cs @@ -24,7 +24,7 @@ public class TransactionMixSummaryGroup public class TransactionMixSummaryTransaction { public Guid Id { get; set; } - public DateTime DateTime { get; set; } + public DateTimeOffset DateTime { get; set; } public string? Merchant { get; set; } public Guid MerchantId { get; set; } public int MerchantReportingId { get; set; } diff --git a/EstateReportingAPI.Models/TransactionSummaryByMerchantRequest.cs b/EstateReportingAPI.Models/TransactionSummaryByMerchantRequest.cs index b814215..919dcf0 100644 --- a/EstateReportingAPI.Models/TransactionSummaryByMerchantRequest.cs +++ b/EstateReportingAPI.Models/TransactionSummaryByMerchantRequest.cs @@ -4,8 +4,8 @@ public class TransactionSummaryByMerchantRequest { public List? Operators { get; set; } public List? Merchants { get; set; } - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } + public DateOnly StartDate { get; set; } + public DateOnly EndDate { get; set; } public int PageNumber { get; set; } = 1; public int PageSize { get; set; } = 50; } diff --git a/EstateReportingAPI.Models/TransactionSummaryByOperatorRequest.cs b/EstateReportingAPI.Models/TransactionSummaryByOperatorRequest.cs index ab4b088..ac901e3 100644 --- a/EstateReportingAPI.Models/TransactionSummaryByOperatorRequest.cs +++ b/EstateReportingAPI.Models/TransactionSummaryByOperatorRequest.cs @@ -4,8 +4,8 @@ public class TransactionSummaryByOperatorRequest { public List? Operators { get; set; } public List? Merchants { get; set; } - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } + public DateOnly StartDate { get; set; } + public DateOnly EndDate { get; set; } public int PageNumber { get; set; } = 1; public int PageSize { get; set; } = 50; } diff --git a/EstateReportingAPI/Handlers/CalenderHandler.cs b/EstateReportingAPI/Handlers/CalenderHandler.cs index 6ae0c6d..453eacf 100644 --- a/EstateReportingAPI/Handlers/CalenderHandler.cs +++ b/EstateReportingAPI/Handlers/CalenderHandler.cs @@ -32,7 +32,7 @@ public static async Task GetCalendarComparisonDates(IEstateContext esta int orderValue = 3; foreach (Calendar d in r) - response.Add(new ComparisonDate { Date = DateOnly.FromDateTime(d.Date), Description = d.Date.ToString("yyyy-MM-dd"), OrderValue = orderValue++ }); + response.Add(new ComparisonDate { Date = d.Date, Description = d.Date.ToString("yyyy-MM-dd"), OrderValue = orderValue++ }); return response.OrderBy(d => d.OrderValue); }); diff --git a/EstateReportingAPI/Handlers/FileImportHandler.cs b/EstateReportingAPI/Handlers/FileImportHandler.cs index 44f0e55..9c6b46c 100644 --- a/EstateReportingAPI/Handlers/FileImportHandler.cs +++ b/EstateReportingAPI/Handlers/FileImportHandler.cs @@ -41,15 +41,15 @@ public static async Task GetFileImportLogList(IEstateContext estateCont IMediator mediator, CancellationToken cancellationToken) { - FileImportLogQueries.GetFileImportLogListQuery query = new(estateContext.EstateId, merchantId, startDate.ToDateTime(TimeOnly.MinValue), endDate.ToDateTime(TimeOnly.MinValue)); + FileImportLogQueries.GetFileImportLogListQuery query = new(estateContext.EstateId, merchantId, startDate, endDate); Result> result = await mediator.Send(query, cancellationToken); return ResponseFactory.FromResult(result, r => r.Select(m => new DataTransferObjects.FileImportLog { FileImportLogId = m.FileImportLogId, - ImportLogDateTime = datePolicy.ToDateTimeOffset(m.ImportLogDateTime), + ImportLogDateTime = m.ImportLogDateTime, FileDetailsList = m.FileDetailsList.Select(fd => new DataTransferObjects.FileDetails { - DateTimeUploaded = datePolicy.ToDateTimeOffset(fd.DateTimeUploaded), + DateTimeUploaded = fd.DateTimeUploaded, FileId = fd.FileId, FileName = fd.FileName, FileProfile = fd.FileProfile, @@ -79,10 +79,10 @@ public static async Task GetFileImportLog(IEstateContext estateContext, return ResponseFactory.FromResult(result, r => new DataTransferObjects.FileImportLog { FileImportLogId = r.FileImportLogId, - ImportLogDateTime = datePolicy.ToDateTimeOffset(r.ImportLogDateTime), + ImportLogDateTime = r.ImportLogDateTime, FileDetailsList = r.FileDetailsList.Select(fd => new DataTransferObjects.FileDetails { - DateTimeUploaded = datePolicy.ToDateTimeOffset(fd.DateTimeUploaded), + DateTimeUploaded = fd.DateTimeUploaded, FileId = fd.FileId, FileName = Path.GetFileName(fd.FileName), FileProfile = fd.FileProfile, diff --git a/EstateReportingAPI/Handlers/SettlementHandler.cs b/EstateReportingAPI/Handlers/SettlementHandler.cs index 1dea593..2b2ed0b 100644 --- a/EstateReportingAPI/Handlers/SettlementHandler.cs +++ b/EstateReportingAPI/Handlers/SettlementHandler.cs @@ -13,7 +13,7 @@ public static async Task TodaysSettlements(IEstateContext estateContext [FromQuery, Description("Date used to compare today's settlements with the corresponding day (YYYY-MM-DD).") ] DateOnly comparisonDate, IMediator mediator, CancellationToken cancellationToken) { - var query = new SettlementQueries.TodaysSettlementQuery(estateContext.EstateId, comparisonDate.ToDateTime(TimeOnly.MinValue)); + var query = new SettlementQueries.TodaysSettlementQuery(estateContext.EstateId, comparisonDate); var result = await mediator.Send(query, cancellationToken); return ResponseFactory.FromResult(result, r => new TodaysSettlement() { diff --git a/EstateReportingAPI/Handlers/TransactionHandler.cs b/EstateReportingAPI/Handlers/TransactionHandler.cs index 59b5ff6..d5f508c 100644 --- a/EstateReportingAPI/Handlers/TransactionHandler.cs +++ b/EstateReportingAPI/Handlers/TransactionHandler.cs @@ -58,8 +58,8 @@ public static async Task TransactionDetailReport(IEstateContext estateC BusinessLogic.ReportingDatePolicy datePolicy, IMediator mediator, CancellationToken cancellationToken) { string? validationError = BusinessLogic.ReportQueryValidation.ValidateDateRange( - request.StartDate.ToDateTime(TimeOnly.MinValue), - request.EndDate.ToDateTime(TimeOnly.MinValue)) + request.StartDate, + request.EndDate) ?? BusinessLogic.ReportQueryValidation.ValidatePaging(request.PageNumber, request.PageSize) ?? BusinessLogic.ReportQueryValidation.ValidateFilterList("merchants", request.Merchants) ?? BusinessLogic.ReportQueryValidation.ValidateFilterList("operators", request.Operators) @@ -71,8 +71,8 @@ public static async Task TransactionDetailReport(IEstateContext estateC Merchants = request.Merchants, Operators = request.Operators, Products = request.Products, - StartDate = request.StartDate.ToDateTime(TimeOnly.MinValue), - EndDate = request.EndDate.ToDateTime(TimeOnly.MinValue), + StartDate = request.StartDate, + EndDate = request.EndDate, PageNumber = request.PageNumber, PageSize = request.PageSize }; @@ -91,7 +91,7 @@ TransactionDetailReportResponse SuccessFactory (Models.TransactionDetailReportRe }, Transactions = r.Transactions.Select(t => new TransactionDetail { TotalFees = t.TotalFees, - DateTime = datePolicy.ToDateTimeOffset(t.DateTime), + DateTime = t.DateTime, Id = t.Id, Merchant = t.Merchant, Operator = t.Operator, @@ -119,8 +119,8 @@ public static async Task TransactionSummaryByMerchantReport(IEstateCont [FromBody] TransactionSummaryByMerchantRequest request, IMediator mediator, CancellationToken cancellationToken) { string? validationError = BusinessLogic.ReportQueryValidation.ValidateDateRange( - request.StartDate.ToDateTime(TimeOnly.MinValue), - request.EndDate.ToDateTime(TimeOnly.MinValue)) + request.StartDate, + request.EndDate) ?? BusinessLogic.ReportQueryValidation.ValidatePaging(request.PageNumber, request.PageSize) ?? BusinessLogic.ReportQueryValidation.ValidateFilterList("merchants", request.Merchants) ?? BusinessLogic.ReportQueryValidation.ValidateFilterList("operators", request.Operators); @@ -130,8 +130,8 @@ public static async Task TransactionSummaryByMerchantReport(IEstateCont Models.TransactionSummaryByMerchantRequest queryRequest = new() { Merchants = request.Merchants, Operators = request.Operators, - StartDate = request.StartDate.ToDateTime(TimeOnly.MinValue), - EndDate = request.EndDate.ToDateTime(TimeOnly.MinValue), + StartDate = request.StartDate, + EndDate = request.EndDate, PageNumber = request.PageNumber, PageSize = request.PageSize }; @@ -171,12 +171,12 @@ public static async Task ProductPerformanceReport(IEstateContext estate CancellationToken cancellationToken) { int requestedPageNumber = pageNumber ?? 1; int requestedPageSize = pageSize ?? 50; - string? validationError = BusinessLogic.ReportQueryValidation.ValidateDateRange(startDate.ToDateTime(TimeOnly.MinValue), endDate.ToDateTime(TimeOnly.MinValue)) + string? validationError = BusinessLogic.ReportQueryValidation.ValidateDateRange(startDate, endDate) ?? BusinessLogic.ReportQueryValidation.ValidatePaging(requestedPageNumber, requestedPageSize); if (validationError != null) return InvalidReportQuery(validationError); - var query = new TransactionQueries.ProductPerformanceQuery(estateContext.EstateId, startDate.ToDateTime(TimeOnly.MinValue), endDate.ToDateTime(TimeOnly.MinValue), requestedPageNumber, requestedPageSize); + var query = new TransactionQueries.ProductPerformanceQuery(estateContext.EstateId, startDate, endDate, requestedPageNumber, requestedPageSize); var result = await mediator.Send(query, cancellationToken); ProductPerformanceResponse SuccessFactory(Models.ProductPerformanceResponse r) => new ProductPerformanceResponse @@ -209,8 +209,8 @@ public static async Task TransactionSummaryByOperatorReport(IEstateCont IMediator mediator, CancellationToken cancellationToken) { string? validationError = BusinessLogic.ReportQueryValidation.ValidateDateRange( - request.StartDate.ToDateTime(TimeOnly.MinValue), - request.EndDate.ToDateTime(TimeOnly.MinValue)) + request.StartDate, + request.EndDate) ?? BusinessLogic.ReportQueryValidation.ValidatePaging(request.PageNumber, request.PageSize) ?? BusinessLogic.ReportQueryValidation.ValidateFilterList("merchants", request.Merchants) ?? BusinessLogic.ReportQueryValidation.ValidateFilterList("operators", request.Operators); @@ -221,8 +221,8 @@ public static async Task TransactionSummaryByOperatorReport(IEstateCont { Merchants = request.Merchants, Operators = request.Operators, - StartDate = request.StartDate.ToDateTime(TimeOnly.MinValue), - EndDate = request.EndDate.ToDateTime(TimeOnly.MinValue), + StartDate = request.StartDate, + EndDate = request.EndDate, PageNumber = request.PageNumber, PageSize = request.PageSize }; @@ -262,8 +262,8 @@ public static async Task TransactionMixSummary(IEstateContext estateCon CancellationToken cancellationToken) { string? validationError = BusinessLogic.ReportQueryValidation.ValidateDateRange( - request.StartDate.ToDateTime(TimeOnly.MinValue), - request.EndDate.ToDateTime(TimeOnly.MinValue)) + request.StartDate, + request.EndDate) ?? BusinessLogic.ReportQueryValidation.ValidatePaging(request.PageNumber, request.PageSize) ?? BusinessLogic.ReportQueryValidation.ValidateTopN(request.TopN); if (validationError != null) @@ -276,8 +276,8 @@ public static async Task TransactionMixSummary(IEstateContext estateCon Models.TransactionMixSummaryRequest queryRequest = new() { MerchantReportingId = request.MerchantReportingId, - StartDate = request.StartDate.ToDateTime(TimeOnly.MinValue), - EndDate = request.EndDate.ToDateTime(TimeOnly.MinValue), + StartDate = request.StartDate, + EndDate = request.EndDate, Breakdown = (Models.TransactionMixBreakdown)request.Breakdown, Measure = (Models.TransactionMixMeasure)request.Measure, TopN = request.TopN, @@ -313,7 +313,7 @@ TransactionMixSummaryResponse SuccessFactory(Models.TransactionMixSummaryRespons Transactions = r.Transactions.Select(t => new TransactionMixSummaryTransaction { Id = t.Id, - DateTime = datePolicy.ToDateTimeOffset(t.DateTime), + DateTime = t.DateTime, Merchant = t.Merchant, MerchantId = t.MerchantId, MerchantReportingId = t.MerchantReportingId, @@ -375,7 +375,7 @@ GetRecentActivityReceiptReportResponse SuccessFactory(Models.GetRecentActivityRe Operator = item.Operator, Status = item.Status, Amount = item.Amount, - TransactionDateTime = datePolicy.ToDateTimeOffset(item.TransactionDateTime), + TransactionDateTime = item.TransactionDateTime, ReceiptReference = item.ReceiptReference }).ToList() }; @@ -411,15 +411,15 @@ public static async Task MerchantDailyPerformanceSummary(IEstateContext IMediator mediator, CancellationToken cancellationToken) { string? validationError = BusinessLogic.ReportQueryValidation.ValidateDateRange( - request.StartDate.ToDateTime(TimeOnly.MinValue), - request.EndDate.ToDateTime(TimeOnly.MinValue)); + request.StartDate, + request.EndDate); if (validationError != null) return InvalidReportQuery(validationError); TransactionQueries.MerchantDailyPerformanceSummaryQuery query = new(estateContext.EstateId, new Models.MerchantDailyPerformanceSummaryRequest { - EndDate = request.EndDate.ToDateTime(TimeOnly.MinValue), + EndDate = request.EndDate, MerchantReportingId = request.MerchantReportingId, - StartDate = request.StartDate.ToDateTime(TimeOnly.MinValue) + StartDate = request.StartDate }); Result result = await mediator.Send(query, cancellationToken); @@ -440,7 +440,7 @@ MerchantDailyPerformanceSummaryResponse SuccessFactory(Models.MerchantDailyPerfo Product = $"{transaction.Operator} {transaction.Product}", Status = transaction.Status, Amount = transaction.Amount, - TransactionDateTime = datePolicy.ToDateTimeOffset(transaction.TransactionDateTime) + TransactionDateTime = transaction.TransactionDateTime }).ToList() ?? [] };