Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
<PackageVersion Include="AspNetCore.HealthChecks.Uris" Version="9.0.0" />
<PackageVersion Include="ClientProxyBase" Version="2026.11.2" />
<PackageVersion Include="HealthMonitoring.Client" Version="2026.10.2.55" />
<PackageVersion Include="OpenIddict.Validation.AspNetCore" Version="7.7.2" />
<PackageVersion Include="OpenIddict.Validation.SystemNetHttp" Version="7.7.2" />
<PackageVersion Include="OpenIddict.Validation.AspNetCore" Version="7.8.0" />
<PackageVersion Include="OpenIddict.Validation.SystemNetHttp" Version="7.8.0" />
<PackageVersion Include="coverlet.collector" Version="10.1.0" />
<PackageVersion Include="coverlet.msbuild" Version="10.1.0" />
<PackageVersion Include="Ductus.FluentDocker" Version="2.85.0" />
<PackageVersion Include="EventStoreProjections" Version="2023.12.3" />
<PackageVersion Include="Grpc.Net.Client" Version="2.84.0" />
<PackageVersion Include="Imposter" Version="1.0.7" />
<PackageVersion Include="Grpc.Net.Client" Version="2.85.0" />
<PackageVersion Include="Imposter" Version="1.0.12" />
<PackageVersion Include="Lamar" Version="16.0.0" />
<PackageVersion Include="Lamar.Microsoft.DependencyInjection" Version="16.0.0" />
<PackageVersion Include="MessagingService.IntegrationTesting.Helpers" Version="2026.10.3.157" />
Expand All @@ -37,22 +37,22 @@
<PackageVersion Include="Reqnroll.NUnit" Version="3.3.4" />
<PackageVersion Include="Reqnroll.Tools.MsBuild.Generation" Version="3.3.4" />
<PackageVersion Include="Sentry.AspNetCore" Version="6.12.1" />
<PackageVersion Include="SharpCompress" Version="0.50.7" />
<PackageVersion Include="SharpCompress" Version="0.50.8" />
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="Shared" Version="2026.11.2" />
<PackageVersion Include="Shared.DomainDrivenDesign" Version="2026.11.2" />
<PackageVersion Include="Shared.EventStore" Version="2026.11.2" />
<PackageVersion Include="Shared.IntegrationTesting" Version="2026.11.2" />
<PackageVersion Include="Shared.Results" Version="2026.11.2" />
<PackageVersion Include="Shared.Results.Web" Version="2026.11.2" />
<PackageVersion Include="SecurityService.Client" Version="2026.10.3.204" />
<PackageVersion Include="SecurityService.IntegrationTesting.Helpers" Version="2026.10.3.204" />
<PackageVersion Include="SecurityService.Client" Version="2026.10.3.207" />
<PackageVersion Include="SecurityService.IntegrationTesting.Helpers" Version="2026.10.3.207" />
<PackageVersion Include="System.IO.Abstractions" Version="22.3.0" />
<PackageVersion Include="System.IO.Abstractions.TestingHelpers" Version="22.3.0" />
<PackageVersion Include="TransactionProcessing.ApiDefaults" Version="2026.11.2" />
<PackageVersion Include="TransactionProcessor.Client" Version="2026.10.2.411" />
<PackageVersion Include="TransactionProcessor.Database" Version="2026.10.2.411" />
<PackageVersion Include="TransactionProcessor.IntegrationTesting.Helpers" Version="2026.10.2.411" />
<PackageVersion Include="TransactionProcessor.Client" Version="2026.10.3.418" />
<PackageVersion Include="TransactionProcessor.Database" Version="2026.10.3.418" />
<PackageVersion Include="TransactionProcessor.IntegrationTesting.Helpers" Version="2026.10.3.418" />
<PackageVersion Include="xunit.v3" Version="4.0.2" />
<PackageVersion Include="xunit.runner.visualstudio" Version="4.0.1" />
</ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion FIleProcessor.Models/FileDetails.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public class FileDetails

public Guid FileProfileVersionId { get; set; }

public DateTime FileReceivedDateTime { get; set; }
public DateTimeOffset FileReceivedDateTime { get; set; }

/// <summary>
/// Gets or sets the merchant identifier.
Expand Down
2 changes: 1 addition & 1 deletion FIleProcessor.Models/FileImportLog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class FileImportLog
/// <value>
/// The file import log date time.
/// </value>
public DateTime FileImportLogDateTime { get; set; }
public DateTimeOffset FileImportLogDateTime { get; set; }

/// <summary>
/// Gets or sets the file import log identifier.
Expand Down
2 changes: 1 addition & 1 deletion FIleProcessor.Models/ImportLogFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public class ImportLogFile
/// <value>
/// The uploaded date time.
/// </value>
public DateTime UploadedDateTime { get; set; }
public DateTimeOffset UploadedDateTime { get; set; }

/// <summary>
/// Gets or sets the user identifier.
Expand Down
2 changes: 1 addition & 1 deletion FIleProcessor.Models/TransactionDispatchAttempt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ public class TransactionDispatchAttempt

public String FailureType { get; set; }

public DateTime AttemptedAt { get; set; }
public DateTimeOffset AttemptedAt { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public async Task FileProcessingManager_GetFileImportLogs_NoMerchantId_ImportLog
this.Context.Merchants.Add(new Merchant { MerchantId = TestData.MerchantId, Name = TestData.MerchantName });
await this.Context.SaveChangesAsync();

Result<FileImportLogQueryResult> getFileImportLogsResult = await this.Manager.GetFileImportLogs(TestData.EstateId, DateOnly.FromDateTime(TestData.ImportLogStartDate), DateOnly.FromDateTime(TestData.ImportLogEndDate), null, 1, 50, false, CancellationToken.None);
Result<FileImportLogQueryResult> getFileImportLogsResult = await this.Manager.GetFileImportLogs(TestData.EstateId, DateOnly.FromDateTime(TestData.ImportLogStartDate.DateTime), DateOnly.FromDateTime(TestData.ImportLogEndDate.DateTime), null, 1, 50, false, CancellationToken.None);
getFileImportLogsResult.IsSuccess.ShouldBeTrue();
List<FileImportLog> importLogs = getFileImportLogsResult.Data.FileImportLogs;
this.VerifyImportLogs(TestData.FileImportLogs,importLogs);
Expand All @@ -120,7 +120,7 @@ public async Task FileProcessingManager_GetFileImportLogs_WithMerchantId_ImportL
this.Context.Merchants.Add(new Merchant { MerchantId = TestData.MerchantId, Name = TestData.MerchantName });
await this.Context.SaveChangesAsync();

Result<FileImportLogQueryResult> importLogsResult = await this.Manager.GetFileImportLogs(TestData.EstateId, DateOnly.FromDateTime(TestData.ImportLogStartDate), DateOnly.FromDateTime(TestData.ImportLogEndDate), TestData.MerchantId, 1, 50, false, CancellationToken.None);
Result<FileImportLogQueryResult> importLogsResult = await this.Manager.GetFileImportLogs(TestData.EstateId, DateOnly.FromDateTime(TestData.ImportLogStartDate.DateTime), DateOnly.FromDateTime(TestData.ImportLogEndDate.DateTime), TestData.MerchantId, 1, 50, false, CancellationToken.None);

this.VerifyImportLogs(TestData.FileImportLogs, importLogsResult.Data.FileImportLogs, TestData.MerchantId);
importLogsResult.Data.FileImportLogs.SelectMany(log => log.Files).ShouldAllBe(file => file.FileProfileVersionId == TestData.FileProfileVersionId);
Expand Down Expand Up @@ -171,8 +171,8 @@ public async Task FileProcessingManager_GetFileImportLogs_DateOnlyRangeIsInclusi

Result<FileImportLogQueryResult> result = await this.Manager.GetFileImportLogs(
TestData.EstateId,
DateOnly.FromDateTime(TestData.ImportLogStartDate),
DateOnly.FromDateTime(TestData.ImportLogEndDate),
DateOnly.FromDateTime(TestData.ImportLogStartDate.DateTime),
DateOnly.FromDateTime(TestData.ImportLogEndDate.DateTime),
null,
1,
1,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Text;
using SimpleResults;
using TransactionProcessor.DataTransferObjects.Requests.Transaction;
using TransactionProcessor.DataTransferObjects.Responses.Contract;
using TransactionProcessor.DataTransferObjects.Responses.Operator;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Shared.Logger;
using SimpleResults;
using TransactionProcessor.DataTransferObjects;
using TransactionProcessor.DataTransferObjects.Responses.Transaction;

namespace FileProcessor.BusinessLogic.Common;

Expand Down
4 changes: 2 additions & 2 deletions FileProcessor.BusinessLogic/Common/Helpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@

public static class Helpers
{
public static Guid CalculateFileImportLogAggregateId(DateTime importLogDateTime,
public static Guid CalculateFileImportLogAggregateId(DateTimeOffset importLogDateTime,
Guid estateId)
{
Guid aggregateId = GuidCalculator.Combine(estateId, importLogDateTime.ToGuid());
Guid aggregateId = GuidCalculator.Combine(estateId, importLogDateTime.DateTime.ToGuid());
return aggregateId;
}
}
Expand Down
4 changes: 2 additions & 2 deletions FileProcessor.BusinessLogic/Requests/FileCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public record ProcessUploadedFileCommand(Guid EstateId,
Guid UserId,
String FilePath,
Guid FileProfileId,
DateTime FileUploadedDateTime,
DateTimeOffset FileUploadedDateTime,
Guid FileProfileVersionId = default) : IRequest<Result>;

public record UploadFileCommand(Guid FileId,
Expand All @@ -26,7 +26,7 @@ public record UploadFileCommand(Guid FileId,
Guid UserId,
String FilePath,
Guid FileProfileId,
DateTime FileUploadedDateTime,
DateTimeOffset FileUploadedDateTime,
String OriginalFileName = null) : IRequest<Result>;

public record ReplayFileLineCommand(Guid FileId,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using SecurityService.DataTransferObjects;
using Shared.EventStore.Helpers;
using TransactionProcessor.DataTransferObjects.Requests.Transaction;
using TransactionProcessor.DataTransferObjects.Responses.Merchant;
using TransactionProcessor.DataTransferObjects.Responses.Transaction;

namespace FileProcessor.BusinessLogic.Services;

Expand Down Expand Up @@ -160,14 +162,14 @@ private async Task<Result> ApplyFileImportLogUpdates(Func<FileImportLogAggregate

public async Task<Result> UploadFile(FileCommands.UploadFileCommand command,
CancellationToken cancellationToken) {
DateTime importLogDateTime = command.FileUploadedDateTime;
DateTimeOffset importLogDateTime = command.FileUploadedDateTime;
Comment thread
StuartFerguson marked this conversation as resolved.
Resolved

Result validateResult = this.ValidateRequest(command);
if (validateResult.IsFailed)
return validateResult;

// The import log is created only after validation and duplicate checks succeed.
Guid importLogId = Helpers.CalculateFileImportLogAggregateId(importLogDateTime.Date, command.EstateId);
Guid importLogId = Helpers.CalculateFileImportLogAggregateId(importLogDateTime, command.EstateId);

Result result = await ApplyFileImportLogUpdates(
fileImportLogAggregate => this.RegisterUploadedFile(command, importLogDateTime, fileImportLogAggregate, cancellationToken),
Expand All @@ -179,7 +181,7 @@ public async Task<Result> UploadFile(FileCommands.UploadFileCommand command,
}

private async Task<Result> RegisterUploadedFile(FileCommands.UploadFileCommand command,
DateTime importLogDateTime,
DateTimeOffset importLogDateTime,
FileImportLogAggregate fileImportLogAggregate,
CancellationToken cancellationToken)
{
Expand Down Expand Up @@ -268,7 +270,7 @@ private Result RegisterDuplicateImportLogFile(FileCommands.UploadFileCommand com

private async Task<Result> RegisterNewImportLogFile(FileCommands.UploadFileCommand command,
String originalName,
DateTime importLogDateTime,
DateTimeOffset importLogDateTime,
FileImportLogAggregate fileImportLogAggregate,
CancellationToken cancellationToken)
{
Expand Down Expand Up @@ -692,6 +694,7 @@ private async Task<Result<SaleTransactionResponse>> SendSaleTransaction(FileDeta
EstateId = fileDetails.EstateId,
MerchantId = fileDetails.MerchantId,
TransactionDateTime = fileDetails.FileReceivedDateTime,
HostDateTime = DateTimeOffset.UtcNow,
TransactionNumber = transactionNumber.ToString(CultureInfo.InvariantCulture),
TransactionType = "Sale",
ContractId = detailsForTransaction.Data.ContractId,
Expand Down
6 changes: 4 additions & 2 deletions FileProcessor.Client/FileProcessorClient.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Linq;
using System.Security.Cryptography;
using Shared.Results;
using System.Globalization;

namespace FileProcessor.Client {
using System;
Expand Down Expand Up @@ -244,8 +245,9 @@ public async Task<Result<Guid>> UploadFile(String accessToken,
formFields.Add(("MerchantId", uploadFileRequest.MerchantId.ToString()));
formFields.Add(("FileProfileId", uploadFileRequest.FileProfileId.ToString()));
formFields.Add(("UserId", uploadFileRequest.UserId.ToString()));
formFields.Add(("UploadDateTime", uploadFileRequest.UploadDateTime.ToString("yyyy-MM-dd HH:mm:ss")));

formFields.Add(("UploadDateTime",
uploadFileRequest.UploadDateTime.ToString("O", CultureInfo.InvariantCulture)));

Guid fileId = CreateGuidFromFileData(fileData);
formFields.Add(("FileId", fileId.ToString()));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,6 @@ public class UploadFileRequest

/// <summary>Gets or sets the time the file was uploaded. If omitted or set to the minimum date value, the server uses the current local time.</summary>
[Description("The time the file was uploaded. If omitted or set to the minimum date value, the server uses the current local time.")]
public DateTime UploadDateTime { get; set; }
public DateTimeOffset UploadDateTime { get; set; }
Comment thread
StuartFerguson marked this conversation as resolved.
Resolved
}
}
4 changes: 2 additions & 2 deletions FileProcessor.DataTransferObjects/Responses/FileImportLog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ public class FileImportLog

/// <summary>Gets or sets the import log timestamp.</summary>
[Description("The import log timestamp.")]
public DateTime ImportLogDateTime { get; set; }
public DateTimeOffset ImportLogDateTime { get; set; }

/// <summary>Gets or sets the calendar date of the import log.</summary>
[Description("The calendar date of the import log.")]
public DateTime ImportLogDate { get; set; }
public DateOnly ImportLogDate { get; set; }

/// <summary>Gets or sets the time of day of the import log.</summary>
[Description("The time of day of the import log.")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class FileImportLogFile

/// <summary>Gets or sets when the file was uploaded.</summary>
[Description("When the file was uploaded.")]
public DateTime FileUploadedDateTime { get; set; }
public DateTimeOffset FileUploadedDateTime { get; set; }

/// <summary>Gets or sets the identifier of the associated merchant.</summary>
[Description("The identifier of the associated merchant.")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ public class TransactionDispatchAttempt

/// <summary>Gets or sets when the dispatch attempt occurred.</summary>
[Description("When the dispatch attempt occurred.")]
public DateTime AttemptedAt { get; set; }
public DateTimeOffset AttemptedAt { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ public record FileLineAddedEvent(Guid FileId, Guid EstateId, Guid MerchantId, In

public record DuplicateFileLineAddedEvent(Guid FileId, Guid EstateId, Guid MerchantId, Int32 LineNumber, String FileLine) : DomainEvent(FileId, Guid.NewGuid());

public record FileProcessingCompletedEvent(Guid FileId, Guid EstateId, Guid MerchantId, DateTime ProcessingCompletedDateTime) : DomainEvent(FileId, Guid.NewGuid());
public record FileProcessingCompletedEvent(Guid FileId, Guid EstateId, Guid MerchantId, DateTimeOffset ProcessingCompletedDateTime) : DomainEvent(FileId, Guid.NewGuid());

public record FileLineProcessingFailedEvent(Guid FileId, Guid EstateId, Guid MerchantId, Int32 LineNumber, Guid TransactionId, String ResponseCode, String ResponseMessage) : DomainEvent(FileId, Guid.NewGuid());

public record FileLineTransactionDispatchFailedEvent(Guid FileId, Guid EstateId, Guid MerchantId, Int32 LineNumber, Int32 TransactionNumber, String FailureType, DateTime AttemptedAt) : DomainEvent(FileId, Guid.NewGuid());
public record FileLineTransactionDispatchFailedEvent(Guid FileId, Guid EstateId, Guid MerchantId, Int32 LineNumber, Int32 TransactionNumber, String FailureType, DateTimeOffset AttemptedAt) : DomainEvent(FileId, Guid.NewGuid());

public record FileLineProcessingRejectedEvent(Guid FileId, Guid EstateId, Guid MerchantId, Int32 LineNumber, String Reason) : DomainEvent(FileId, Guid.NewGuid());

Expand All @@ -26,7 +26,7 @@ public record FileCreatedEvent(Guid FileId,
Guid UserId,
Guid FileProfileId,
String FileLocation,
DateTime FileReceivedDateTime,
DateTimeOffset FileReceivedDateTime,
Guid OperatorId,
Guid FileProfileVersionId = default) : DomainEvent(FileId, Guid.NewGuid());

Expand All @@ -40,5 +40,5 @@ public record FileRejectedEvent(Guid FileId,
String RejectionReason,
Int32 ObservedDetailRecordCount,
Int32 MaximumDetailRecordCount,
DateTime RejectedDateTime) : DomainEvent(FileId, Guid.NewGuid());
DateTimeOffset RejectedDateTime) : DomainEvent(FileId, Guid.NewGuid());
}
Loading
Loading