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
22 changes: 22 additions & 0 deletions TransactionProcessor.Aggregates/TransactionAggregate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,23 @@ public static void CompleteTransaction(this TransactionAggregate aggregate)
aggregate.ApplyAndAppend(transactionHasBeenCompletedEvent);
}

public static void RecordTransactionTimings(this TransactionAggregate aggregate,
DateTime TransactionStartedDateTime,
DateTime? OperatorCommunicationsStartedEvent,
DateTime? OperatorCommunicationsCompletedEvent,
DateTime TransactionCompletedDateTime) {
TransactionDomainEvents.TransactionTimingsAddedToTransactionEvent transactionTimingsAddedToTransactionEvent =
new (aggregate.AggregateId,
aggregate.EstateId,
aggregate.MerchantId,
TransactionStartedDateTime,
OperatorCommunicationsStartedEvent,
OperatorCommunicationsCompletedEvent,
TransactionCompletedDateTime);

aggregate.ApplyAndAppend(transactionTimingsAddedToTransactionEvent);
}

public static void RecordAdditionalRequestData(this TransactionAggregate aggregate,
Guid operatorId,
Dictionary<String, String> additionalTransactionRequestMetadata)
Expand Down Expand Up @@ -661,6 +678,11 @@ public static void PlayEvent(this TransactionAggregate aggregate, TransactionDom
FeeCalculationType = (CalculationType)domainEvent.FeeCalculationType
});
}

public static void PlayEvent(this TransactionAggregate aggregate,
TransactionDomainEvents.TransactionTimingsAddedToTransactionEvent domainEvent) {
// Nothing to do here, just a marker for the event
}
}

public record TransactionAggregate : Aggregate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public async Task TransactionDomainService_ProcessLogonTransaction_DeviceNeedsAd
TestData.DeviceIdentifier,
TestData.TransactionTypeLogon.ToString(),
TestData.TransactionDateTime,
TestData.TransactionNumber);
TestData.TransactionNumber, TestData.TransactionReceivedDateTime);

var result = await this.TransactionDomainService.ProcessLogonTransaction(command, CancellationToken.None);

Expand Down Expand Up @@ -122,7 +122,7 @@ public async Task TransactionDomainService_ProcessLogonTransaction_TransactionIs
TestData.DeviceIdentifier,
TestData.TransactionTypeLogon.ToString(),
TestData.TransactionDateTime,
TestData.TransactionNumber);
TestData.TransactionNumber, TestData.TransactionReceivedDateTime);

var result = await this.TransactionDomainService.ProcessLogonTransaction(command, CancellationToken.None);

Expand Down Expand Up @@ -153,7 +153,7 @@ public async Task TransactionDomainService_ProcessLogonTransaction_ValidationFai
TestData.DeviceIdentifier,
TestData.TransactionTypeLogon.ToString(),
TestData.TransactionDateTime,
TestData.TransactionNumber);
TestData.TransactionNumber, TestData.TransactionReceivedDateTime);

Result<ProcessLogonTransactionResponse> result = await this.TransactionDomainService.ProcessLogonTransaction(command, CancellationToken.None);

Expand Down Expand Up @@ -259,7 +259,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_DeclinedByOper
TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionTypeSale.ToString(),
TestData.TransactionDateTime, TestData.TransactionNumber, TestData.OperatorId,
TestData.CustomerEmailAddress, TestData.AdditionalTransactionMetaDataForMobileTopup(),
TestData.ContractId, TestData.ProductId, TestData.TransactionSource);
TestData.ContractId, TestData.ProductId, TestData.TransactionSource, TestData.TransactionReceivedDateTime);

ProcessSaleTransactionResponse response = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None);

Expand Down Expand Up @@ -300,7 +300,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_OperatorProxyT
TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionTypeSale.ToString(),
TestData.TransactionDateTime, TestData.TransactionNumber, TestData.OperatorId,
TestData.CustomerEmailAddress, TestData.AdditionalTransactionMetaDataForMobileTopup(),
TestData.ContractId, TestData.ProductId, TestData.TransactionSource);
TestData.ContractId, TestData.ProductId, TestData.TransactionSource, TestData.TransactionReceivedDateTime);

ProcessSaleTransactionResponse response = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None);

Expand Down Expand Up @@ -358,7 +358,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_TransactionIsP
TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionTypeSale.ToString(),
TestData.TransactionDateTime, TestData.TransactionNumber, TestData.OperatorId,
TestData.CustomerEmailAddress, TestData.AdditionalTransactionMetaDataForMobileTopup(),
TestData.ContractId, TestData.ProductId, TestData.TransactionSource);
TestData.ContractId, TestData.ProductId, TestData.TransactionSource, TestData.TransactionReceivedDateTime);

ProcessSaleTransactionResponse response = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None);

Expand Down Expand Up @@ -420,7 +420,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_NoFloatFound_T
TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionTypeSale.ToString(),
TestData.TransactionDateTime, TestData.TransactionNumber, TestData.OperatorId,
TestData.CustomerEmailAddress, TestData.AdditionalTransactionMetaDataForMobileTopup(),
TestData.ContractId, TestData.ProductId, TestData.TransactionSource);
TestData.ContractId, TestData.ProductId, TestData.TransactionSource, TestData.TransactionReceivedDateTime);

ProcessSaleTransactionResponse response = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None);

Expand Down Expand Up @@ -462,7 +462,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_ValidationFail
TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionTypeSale.ToString(),
TestData.TransactionDateTime, TestData.TransactionNumber, TestData.OperatorId,
TestData.CustomerEmailAddress, TestData.AdditionalTransactionMetaDataForMobileTopup(),
TestData.ContractId, TestData.ProductId, TestData.TransactionSource);
TestData.ContractId, TestData.ProductId, TestData.TransactionSource, TestData.TransactionReceivedDateTime);

ProcessSaleTransactionResponse response = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ public async Task<Result> Handle(IDomainEvent domainEvent,
TransactionDomainEvents.TransactionSourceAddedToTransactionEvent de => this.EstateReportingRepository.AddSourceDetailsToTransaction(de, cancellationToken),
TransactionDomainEvents.ProductDetailsAddedToTransactionEvent de => this.EstateReportingRepository.AddProductDetailsToTransaction(de, cancellationToken),
TransactionDomainEvents.TransactionHasBeenCompletedEvent de => this.EstateReportingRepository.CompleteTransaction(de, cancellationToken),
TransactionDomainEvents.TransactionTimingsAddedToTransactionEvent de => this.EstateReportingRepository.RecordTransactionTimings(de, cancellationToken),
ReconciliationDomainEvents.ReconciliationHasStartedEvent de => this.EstateReportingRepository.StartReconciliation(de, cancellationToken),
ReconciliationDomainEvents.OverallTotalsRecordedEvent de => this.EstateReportingRepository.UpdateReconciliationOverallTotals(de, cancellationToken),
ReconciliationDomainEvents.ReconciliationHasBeenLocallyAuthorisedEvent de => this.EstateReportingRepository.UpdateReconciliationStatus(de, cancellationToken),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ public record ProcessLogonTransactionCommand(Guid TransactionId,
String DeviceIdentifier,
String TransactionType,
DateTime TransactionDateTime,
String TransactionNumber)
String TransactionNumber,
DateTime TransactionReceivedDateTime)
: IRequest<Result<ProcessLogonTransactionResponse>>;

public record ProcessReconciliationCommand(Guid TransactionId,
Expand All @@ -40,7 +41,8 @@ public record ProcessSaleTransactionCommand(Guid TransactionId,
Dictionary<String, String> AdditionalTransactionMetadata,
Guid ContractId,
Guid ProductId,
Int32 TransactionSource)
Int32 TransactionSource,
DateTime TransactionReceivedDateTime)
: IRequest<Result<ProcessSaleTransactionResponse>>;

public record ResendTransactionReceiptCommand(Guid TransactionId, Guid EstateId) : IRequest<Result>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,9 +203,11 @@
// Record the failure
transactionAggregate.DeclineTransactionLocally(((Int32)validationResult.Data.ResponseCode).ToString().PadLeft(4, '0'), validationResult.Data.ResponseMessage);
}

transactionAggregate.CompleteTransaction();

transactionAggregate.RecordTransactionTimings(command.TransactionReceivedDateTime, null, null,DateTime.Now);

return Result.Success(new ProcessLogonTransactionResponse {
ResponseMessage = transactionAggregate.ResponseMessage,
ResponseCode = transactionAggregate.ResponseCode,
Expand Down Expand Up @@ -237,7 +239,7 @@
// Record the failure
reconciliationAggregate.Decline(((Int32)validationResult.Data.ResponseCode).ToString().PadLeft(4, '0'), validationResult.Data.ResponseMessage);
}

reconciliationAggregate.CompleteReconciliation();

return Result.Success(new ProcessReconciliationTransactionResponse {
Expand Down Expand Up @@ -292,7 +294,8 @@

// Add the transaction source
transactionAggregate.AddTransactionSource(transactionSourceValue);

DateTime? operatorStartDateTime = null;
DateTime? operatorEndDateTime = null;
if (validationResult.Data.ResponseCode == TransactionResponseCode.Success) {
// Record any additional request metadata
transactionAggregate.RecordAdditionalRequestData(command.OperatorId, command.AdditionalTransactionMetadata);
Expand All @@ -301,8 +304,9 @@
Result<Merchant> merchantResult = await this.GetMerchant(command.MerchantId, cancellationToken);
if (merchantResult.IsFailed)
return ResultHelpers.CreateFailure(merchantResult);
operatorStartDateTime =DateTime.Now;
Result<OperatorResponse> operatorResult = await this.ProcessMessageWithOperator(merchantResult.Data, command.TransactionId, command.TransactionDateTime, command.OperatorId, command.AdditionalTransactionMetadata, transactionReference, cancellationToken);

operatorEndDateTime = DateTime.Now;
// Act on the operator response
// TODO: see if we still need this case...
//if (operatorResult.IsFailed) {
Expand Down Expand Up @@ -338,6 +342,8 @@
transactionAggregate.DeclineTransactionLocally(((Int32)validationResult.Data.ResponseCode).ToString().PadLeft(4, '0'), validationResult.Data.ResponseMessage);
}

transactionAggregate.RecordTransactionTimings(command.TransactionReceivedDateTime, operatorStartDateTime, operatorEndDateTime, DateTime.Now);;

Check notice on line 345 in TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs#L345

Remove this empty statement.

transactionAggregate.CompleteTransaction();

// Determine if the email receipt is required
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ public EstateManagementGenericContext(DbContextOptions dbContextOptions) : base(
public DbSet<TodayTransaction> TodayTransactions { get; set; }
public DbSet<TransactionHistory> TransactionHistory { get; set; }

public DbSet<TransactionTimings> TransactionTimings { get; set; }

public DbSet<Event> Events { get; set; }

#endregion
Expand Down Expand Up @@ -266,7 +268,8 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
.SetupOperator()
.SetupSettlementSummary()
.SetupTransactionHistory()
.SetupTodaysTransactions();
.SetupTodaysTransactions()
.SetupTransactionTimings();

modelBuilder.SetupViewEntities();

Expand Down
8 changes: 8 additions & 0 deletions TransactionProcessor.Database/Contexts/Extensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,14 @@ public static ModelBuilder SetupMerchantSettlementFee(this ModelBuilder modelBui
return modelBuilder;
}

public static ModelBuilder SetupTransactionTimings(this ModelBuilder modelBuilder) {
modelBuilder.Entity<TransactionTimings>().HasKey(t => new {
t.TransactionId
}).IsClustered(false);

return modelBuilder;
}

public static ModelBuilder SetupTransaction(this ModelBuilder modelBuilder){
modelBuilder.Entity<Transaction>().HasKey(t => new {
t.TransactionReportingId,
Expand Down
15 changes: 15 additions & 0 deletions TransactionProcessor.Database/Entities/TransactionTimings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.ComponentModel.DataAnnotations.Schema;

namespace TransactionProcessor.Database.Entities;

[Table("transactiontimings")]
public class TransactionTimings {
public Guid TransactionId { get; set; }
public DateTime TransactionStartedDateTime { get; set; }
public DateTime? OperatorCommunicationsStartedDateTime { get; set; }
public DateTime? OperatorCommunicationsCompletedDateTime { get; set; }
public DateTime TransactionCompletedDateTime { get; set; }
public Double TotalTransactionInMilliseconds { get; set; }
public Double OperatorCommunicationsDurationInMilliseconds { get; set; }
public Double TransactionProcessingDurationInMilliseconds { get; set; }
}
Loading
Loading