From 3de41033f31675b2f84277514507cddc9c2dcb47 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Mon, 17 Jul 2023 12:06:27 +0100 Subject: [PATCH] Record process settlement calls --- .../Services/SettlementDomainService.cs | 8 ++++- .../SettlementProcessingStartedEvent.cs | 9 ++++++ .../SettlementAggregateTests.cs | 31 +++++++++++++++++++ .../SettlementAggregate.cs | 21 ++++++++++++- TransactionProcessor.Testing/TestData.cs | 3 ++ 5 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 TransactionProcessor.Settlement.DomainEvents/SettlementProcessingStartedEvent.cs diff --git a/TransactionProcessor.BusinessLogic/Services/SettlementDomainService.cs b/TransactionProcessor.BusinessLogic/Services/SettlementDomainService.cs index a90b21f1..35c33b67 100644 --- a/TransactionProcessor.BusinessLogic/Services/SettlementDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/SettlementDomainService.cs @@ -2,6 +2,7 @@ { using System; using System.Collections.Generic; + using System.Linq; using System.Threading; using System.Threading.Tasks; using Common; @@ -38,7 +39,12 @@ public async Task ProcessSettlement(DateTime settleme List<(Guid transactionId, Guid merchantId, CalculatedFee calculatedFee)> feesToBeSettled = settlementAggregate.GetFeesToBeSettled(); response.NumberOfFeesPendingSettlement = feesToBeSettled.Count; - + if (feesToBeSettled.Any()){ + // Record the process call + settlementAggregate.StartProcessing(DateTime.Now); + await this.SettlementAggregateRepository.SaveChanges(settlementAggregate, cancellationToken); + } + foreach ((Guid transactionId, Guid merchantId, CalculatedFee calculatedFee) feeToSettle in feesToBeSettled) { diff --git a/TransactionProcessor.Settlement.DomainEvents/SettlementProcessingStartedEvent.cs b/TransactionProcessor.Settlement.DomainEvents/SettlementProcessingStartedEvent.cs new file mode 100644 index 00000000..6e7fc762 --- /dev/null +++ b/TransactionProcessor.Settlement.DomainEvents/SettlementProcessingStartedEvent.cs @@ -0,0 +1,9 @@ +namespace TransactionProcessor.Settlement.DomainEvents; + +using System; +using Shared.DomainDrivenDesign.EventSourcing; + +public record SettlementProcessingStartedEvent(Guid SettlementId, + Guid EstateId, + Guid MerchantId, + DateTime ProcessingStartedDateTime) : DomainEvent(SettlementId, Guid.NewGuid()); \ No newline at end of file diff --git a/TransactionProcessor.SettlementAggregates.Tests/SettlementAggregateTests.cs b/TransactionProcessor.SettlementAggregates.Tests/SettlementAggregateTests.cs index 09f86f61..7afe7b44 100644 --- a/TransactionProcessor.SettlementAggregates.Tests/SettlementAggregateTests.cs +++ b/TransactionProcessor.SettlementAggregates.Tests/SettlementAggregateTests.cs @@ -190,5 +190,36 @@ public void SettlementAggregate_ImmediatelyMarkFeeAsSettled_FeeIsSettledAndSettl aggregate.SettlementComplete.ShouldBeFalse(); } + [Fact] + public void SettlementAggregate_StartProcessing_ProcessingStarted() + { + SettlementAggregate aggregate = SettlementAggregate.Create(TestData.SettlementAggregateId); + aggregate.Create(TestData.EstateId, TestData.MerchantId, TestData.SettlementDate); + aggregate.StartProcessing(TestData.SettlementProcessingStartedDateTime); + + aggregate.ProcessingStarted.ShouldBeTrue(); + aggregate.ProcessingStartedDateTime.ShouldBe(TestData.SettlementProcessingStartedDateTime); + } + + [Fact] + public void SettlementAggregate_StartProcessing_CalledTwice_ProcessingStarted(){ + SettlementAggregate aggregate = SettlementAggregate.Create(TestData.SettlementAggregateId); + aggregate.Create(TestData.EstateId, TestData.MerchantId, TestData.SettlementDate); + aggregate.StartProcessing(TestData.SettlementProcessingStartedDateTime); + aggregate.StartProcessing(TestData.SettlementProcessingStartedDateTimeSecondCall); + + aggregate.ProcessingStarted.ShouldBeTrue(); + aggregate.ProcessingStartedDateTime.ShouldBe(TestData.SettlementProcessingStartedDateTimeSecondCall); + } + + [Fact] + public void SettlementAggregate_StartProcessing_SettlementNotCreated_ErrorThron() + { + SettlementAggregate aggregate = SettlementAggregate.Create(TestData.SettlementAggregateId); + + Should.Throw(() => { + aggregate.StartProcessing(TestData.SettlementProcessingStartedDateTime); + }); + } } } \ No newline at end of file diff --git a/TransactionProcessor.SettlementAggregates/SettlementAggregate.cs b/TransactionProcessor.SettlementAggregates/SettlementAggregate.cs index 33217e39..7985f135 100644 --- a/TransactionProcessor.SettlementAggregates/SettlementAggregate.cs +++ b/TransactionProcessor.SettlementAggregates/SettlementAggregate.cs @@ -11,6 +11,17 @@ using Shared.General; public static class SettlementAggregateExtensions{ + public static void StartProcessing(this SettlementAggregate aggregate, DateTime dateTime){ + + aggregate.CheckHasBeenCreated(); + + SettlementProcessingStartedEvent startedEvent = new SettlementProcessingStartedEvent(aggregate.AggregateId, + aggregate.EstateId, + aggregate.MerchantId, + dateTime); + aggregate.ApplyAndAppend(startedEvent); + } + public static void MarkFeeAsSettled(this SettlementAggregate aggregate, Guid merchantId, Guid transactionId, Guid feeId) { (Guid transactionId, Guid merchantId, CalculatedFee calculatedFee) pendingFee = SettlementAggregateExtensions.GetPendingFee(aggregate, merchantId, transactionId, feeId); @@ -220,6 +231,11 @@ public static void PlayEvent(this SettlementAggregate aggregate, SettlementCompl { aggregate.SettlementComplete = true; } + + public static void PlayEvent(this SettlementAggregate aggregate, SettlementProcessingStartedEvent domainEvent){ + aggregate.ProcessingStarted= true; + aggregate.ProcessingStartedDateTime = domainEvent.ProcessingStartedDateTime; + } } public record SettlementAggregate : Aggregate @@ -274,10 +290,13 @@ private SettlementAggregate(Guid aggregateId) public Boolean SettlementComplete { get; internal set; } + public Boolean ProcessingStarted { get; internal set; } + + public DateTime ProcessingStartedDateTime { get; internal set; } #endregion #region Methods - + /// /// Creates the specified aggregate identifier. /// diff --git a/TransactionProcessor.Testing/TestData.cs b/TransactionProcessor.Testing/TestData.cs index 85121ddc..86e4fa04 100644 --- a/TransactionProcessor.Testing/TestData.cs +++ b/TransactionProcessor.Testing/TestData.cs @@ -1187,6 +1187,9 @@ public static SettlementAggregate GetSettlementAggregateWithNotAllFeesSettled(In public static Int32 EstateReportingId = 1; + public static DateTime SettlementProcessingStartedDateTime = new DateTime(2023,7,17,11,12,20); + public static DateTime SettlementProcessingStartedDateTimeSecondCall = new DateTime(2023, 7, 17, 11, 12, 40); + public static RedeemVoucherResponse RedeemVoucherResponse => new RedeemVoucherResponse {