diff --git a/TransactionProcessor.Aggregates/MerchantStatementForDateAggregate.cs b/TransactionProcessor.Aggregates/MerchantStatementForDateAggregate.cs index 70d88bfc..fd540647 100644 --- a/TransactionProcessor.Aggregates/MerchantStatementForDateAggregate.cs +++ b/TransactionProcessor.Aggregates/MerchantStatementForDateAggregate.cs @@ -25,7 +25,7 @@ public static Result AddSettledFeeToStatement(this MerchantStatementForDateAggre if (result.IsFailed) return result; - MerchantStatementForDateDomainEvents.SettledFeeAddedToStatementForDateEvent settledFeeAddedToStatementEvent = new(aggregate.AggregateId, eventId, aggregate.EstateId, aggregate.MerchantId, settledFee.SettledFeeId, settledFee.TransactionId, settledFee.DateTime, settledFee.Amount); + MerchantStatementForDateDomainEvents.SettledFeeAddedToStatementForDateEvent settledFeeAddedToStatementEvent = new(aggregate.AggregateId, eventId, aggregate.EstateId, aggregate.MerchantId, merchantStatementId, settledFee.SettledFeeId, settledFee.TransactionId, settledFee.DateTime, settledFee.Amount); aggregate.ApplyAndAppend(settledFeeAddedToStatementEvent); @@ -45,7 +45,7 @@ public static Result AddDepositToStatement(this MerchantStatementForDateAggregat if (result.IsFailed) return result; - MerchantStatementForDateDomainEvents.DepositAddedToStatementForDateEvent depositAddedToStatementEvent = new(aggregate.AggregateId, eventId, aggregate.EstateId, aggregate.MerchantId, deposit.DepositId, deposit.DepositDateTime, deposit.Amount); + MerchantStatementForDateDomainEvents.DepositAddedToStatementForDateEvent depositAddedToStatementEvent = new(aggregate.AggregateId, eventId, aggregate.EstateId, aggregate.MerchantId, merchantStatementId, deposit.DepositId, deposit.DepositDateTime, deposit.Amount); aggregate.ApplyAndAppend(depositAddedToStatementEvent); @@ -65,7 +65,7 @@ public static Result AddWithdrawalToStatement(this MerchantStatementForDateAggre if (result.IsFailed) return result; - MerchantStatementForDateDomainEvents.WithdrawalAddedToStatementForDateEvent withdrawalAddedToStatementEvent = new(aggregate.AggregateId, eventId, aggregate.EstateId, aggregate.MerchantId, withdrawal.WithdrawalId, withdrawal.WithdrawalDateTime, withdrawal.Amount); + MerchantStatementForDateDomainEvents.WithdrawalAddedToStatementForDateEvent withdrawalAddedToStatementEvent = new(aggregate.AggregateId, eventId, aggregate.EstateId, aggregate.MerchantId, merchantStatementId, withdrawal.WithdrawalId, withdrawal.WithdrawalDateTime, withdrawal.Amount); aggregate.ApplyAndAppend(withdrawalAddedToStatementEvent); @@ -89,6 +89,7 @@ public static Result AddTransactionToStatement(this MerchantStatementForDateAggr eventId, aggregate.EstateId, aggregate.MerchantId, + merchantStatementId, transaction.TransactionId, transaction.DateTime, transaction.Amount); diff --git a/TransactionProcessor.BusinessLogic/EventHandling/ReadModelDomainEventHandler.cs b/TransactionProcessor.BusinessLogic/EventHandling/ReadModelDomainEventHandler.cs index 2eb3baac..f5fe1bfc 100644 --- a/TransactionProcessor.BusinessLogic/EventHandling/ReadModelDomainEventHandler.cs +++ b/TransactionProcessor.BusinessLogic/EventHandling/ReadModelDomainEventHandler.cs @@ -92,10 +92,8 @@ public async Task Handle(IDomainEvent domainEvent, FileProcessor.File.DomainEvents.FileProcessingCompletedEvent de => this.EstateReportingRepository.UpdateFileAsComplete(de, cancellationToken), MerchantStatementDomainEvents.StatementCreatedEvent de => this.EstateReportingRepository.CreateStatement(de, cancellationToken), - // TODO@ Add this back in - //MerchantStatementDomainEvents.TransactionAddedToStatementEvent de => this.EstateReportingRepository.AddTransactionToStatement(de, cancellationToken), - // TODO@ Add this back in - //MerchantStatementDomainEvents.SettledFeeAddedToStatementEvent de => this.EstateReportingRepository.AddSettledFeeToStatement(de, cancellationToken), + MerchantStatementForDateDomainEvents.TransactionAddedToStatementForDateEvent de => this.EstateReportingRepository.AddTransactionToStatement(de, cancellationToken), + MerchantStatementForDateDomainEvents.SettledFeeAddedToStatementForDateEvent de => this.EstateReportingRepository.AddSettledFeeToStatement(de, cancellationToken), MerchantStatementDomainEvents.StatementGeneratedEvent de => this.HandleSpecificDomainEvent(de, cancellationToken), FloatCreatedForContractProductEvent de => this.EstateReportingRepository.CreateFloat(de, cancellationToken), diff --git a/TransactionProcessor.DomainEvents/MerchantStatementDomainEvents.cs b/TransactionProcessor.DomainEvents/MerchantStatementDomainEvents.cs index c83cef4e..2efa4b2d 100644 --- a/TransactionProcessor.DomainEvents/MerchantStatementDomainEvents.cs +++ b/TransactionProcessor.DomainEvents/MerchantStatementDomainEvents.cs @@ -26,12 +26,12 @@ public record StatementSummaryForDateEvent(Guid MerchantStatementId, Guid Estate public class MerchantStatementForDateDomainEvents { public record StatementCreatedForDateEvent(Guid MerchantStatementForDateId, DateTime ActivityDate, DateTime MerchantStatementDate, Guid MerchantStatementId, Guid EstateId, Guid MerchantId) : DomainEvent(MerchantStatementForDateId, Guid.NewGuid()); - public record SettledFeeAddedToStatementForDateEvent(Guid MerchantStatementForDateId, Guid EventId, Guid EstateId, Guid MerchantId, Guid SettledFeeId, Guid TransactionId, DateTime SettledDateTime, Decimal SettledValue) : DomainEvent(MerchantStatementForDateId, EventId); + public record SettledFeeAddedToStatementForDateEvent(Guid MerchantStatementForDateId, Guid EventId, Guid EstateId, Guid MerchantId, Guid MerchantStatementId, Guid SettledFeeId, Guid TransactionId, DateTime SettledDateTime, Decimal SettledValue) : DomainEvent(MerchantStatementForDateId, EventId); - public record TransactionAddedToStatementForDateEvent(Guid MerchantStatementForDateId, Guid EventId, Guid EstateId, Guid MerchantId, Guid TransactionId, DateTime TransactionDateTime, Decimal TransactionValue) : DomainEvent(MerchantStatementForDateId, EventId); + public record TransactionAddedToStatementForDateEvent(Guid MerchantStatementForDateId, Guid EventId, Guid EstateId, Guid MerchantId, Guid MerchantStatementId, Guid TransactionId, DateTime TransactionDateTime, Decimal TransactionValue) : DomainEvent(MerchantStatementForDateId, EventId); - public record DepositAddedToStatementForDateEvent(Guid MerchantStatementForDateId, Guid EventId, Guid EstateId, Guid MerchantId, Guid DepositId, DateTime DepositDateTime, Decimal DepositAmount) : DomainEvent(MerchantStatementForDateId, EventId); - public record WithdrawalAddedToStatementForDateEvent(Guid MerchantStatementForDateId, Guid EventId, Guid EstateId, Guid MerchantId, Guid WithdrawalId, DateTime WithdrawalDateTime, Decimal WithdrawalAmount) : DomainEvent(MerchantStatementForDateId, EventId); + public record DepositAddedToStatementForDateEvent(Guid MerchantStatementForDateId, Guid EventId, Guid EstateId, Guid MerchantId, Guid MerchantStatementId, Guid DepositId, DateTime DepositDateTime, Decimal DepositAmount) : DomainEvent(MerchantStatementForDateId, EventId); + public record WithdrawalAddedToStatementForDateEvent(Guid MerchantStatementForDateId, Guid EventId, Guid EstateId, Guid MerchantId, Guid MerchantStatementId, Guid WithdrawalId, DateTime WithdrawalDateTime, Decimal WithdrawalAmount) : DomainEvent(MerchantStatementForDateId, EventId); } } \ No newline at end of file diff --git a/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs b/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs index c62f6dc9..b9c86229 100644 --- a/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs +++ b/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs @@ -286,7 +286,13 @@ Task>> GetSettlements(Guid estateId, String endDate, CancellationToken cancellationToken); - Task RecordTransactionTimings(TransactionDomainEvents.TransactionTimingsAddedToTransactionEvent de, + Task RecordTransactionTimings(TransactionDomainEvents.TransactionTimingsAddedToTransactionEvent domainEvent, + CancellationToken cancellationToken); + + Task AddTransactionToStatement(MerchantStatementForDateDomainEvents.TransactionAddedToStatementForDateEvent domainEvent, + CancellationToken cancellationToken); + + Task AddSettledFeeToStatement(MerchantStatementForDateDomainEvents.SettledFeeAddedToStatementForDateEvent domainEvent, CancellationToken cancellationToken); } @@ -2050,7 +2056,7 @@ public async Task RecordTransactionTimings(TransactionDomainEvents.Trans CancellationToken cancellationToken) { // Calculate the timings for the transaction TimeSpan totalTime = domainEvent.TransactionCompletedDateTime.Subtract(domainEvent.TransactionStartedDateTime); - // Calculte the timings for the operator communications + // Calculate the timings for the operator communications TimeSpan operatorCommunicationsTime = domainEvent.OperatorCommunicationsCompletedEvent?.Subtract(domainEvent.OperatorCommunicationsStartedEvent ?? DateTime.MinValue) ?? TimeSpan.Zero; // Calculate the timings for the transaction without operator timings TimeSpan transactionTime = totalTime.Subtract(operatorCommunicationsTime); @@ -2071,5 +2077,71 @@ public async Task RecordTransactionTimings(TransactionDomainEvents.Trans await context.TransactionTimings.AddAsync(timings, cancellationToken); return await context.SaveChangesWithDuplicateHandling(cancellationToken); } + + public async Task AddTransactionToStatement(MerchantStatementForDateDomainEvents.TransactionAddedToStatementForDateEvent domainEvent, + CancellationToken cancellationToken) { + // Load this information to the database + EstateManagementContext context = await this.GetContext(domainEvent.EstateId); + + // Find the corresponding transaction + Result transactionResult = await context.LoadTransaction(domainEvent, cancellationToken); + if (transactionResult.IsFailed) + return ResultHelpers.CreateFailure(transactionResult); + + Transaction transaction = transactionResult.Data; + + Result operatorResult = await context.LoadOperator(transaction.OperatorId, cancellationToken); + if (operatorResult.IsFailed) + return ResultHelpers.CreateFailure(operatorResult); + Operator @operator = operatorResult.Data; + + StatementLine line = new StatementLine + { + StatementId = domainEvent.MerchantStatementId, + ActivityDateTime = domainEvent.TransactionDateTime, + ActivityDate = domainEvent.TransactionDateTime.Date, + ActivityDescription = $"{@operator.Name} Transaction", + ActivityType = 1, // Transaction + TransactionId = domainEvent.TransactionId, + OutAmount = domainEvent.TransactionValue + }; + + await context.StatementLines.AddAsync(line, cancellationToken); + return await context.SaveChangesWithDuplicateHandling(cancellationToken); + } + + public async Task AddSettledFeeToStatement(MerchantStatementForDateDomainEvents.SettledFeeAddedToStatementForDateEvent domainEvent, + CancellationToken cancellationToken) + { + // Load this information to the database + EstateManagementContext context = await this.GetContext(domainEvent.EstateId); + + // Find the corresponding transaction + var getTransactionResult = await context.LoadTransaction(domainEvent, cancellationToken); + if (getTransactionResult.IsFailed) + return ResultHelpers.CreateFailure(getTransactionResult); + var transaction = getTransactionResult.Data; + + Result operatorResult = await context.LoadOperator(transaction.OperatorId, cancellationToken); + if (operatorResult.IsFailed) + return ResultHelpers.CreateFailure(operatorResult); + var @operator = operatorResult.Data; + + StatementLine line = new StatementLine + { + StatementId = domainEvent.MerchantStatementId, + ActivityDateTime = domainEvent.SettledDateTime, + ActivityDate = domainEvent.SettledDateTime.Date, + ActivityDescription = $"{@operator.Name} Transaction Fee", + ActivityType = 2, // Transaction Fee + TransactionId = domainEvent.TransactionId, + InAmount = domainEvent.SettledValue + }; + + await context.StatementLines.AddAsync(line, cancellationToken); + + return await context.SaveChangesWithDuplicateHandling(cancellationToken); + } + } }