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
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="EstateManagement.Client" Version="1.1.5" />
<PackageReference Include="EstateManagement.Client" Version="2022.12.1-build27" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0" />
<PackageReference Include="EstateReporting.Database" Version="1.1.7" />
<PackageReference Include="MessagingService.Client" Version="1.1.4" />
<PackageReference Include="SecurityService.Client" Version="1.1.1" />
<PackageReference Include="Shared.DomainDrivenDesign" Version="2022.12.0-beta3" />
<PackageReference Include="Shared.EventStore" Version="2022.12.0-beta3" />
<PackageReference Include="MessagingService.Client" Version="2022.12.1-build31" />
<PackageReference Include="SecurityService.Client" Version="2022.11.2-build28" />
<PackageReference Include="Shared.DomainDrivenDesign" Version="2022.12.0" />
<PackageReference Include="Shared.EventStore" Version="2022.12.0" />
<PackageReference Include="MediatR" Version="11.0.0" />
<PackageReference Include="System.IO.Abstractions" Version="17.2.3" />
<PackageReference Include="System.ServiceModel.Duplex" Version="4.10.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="ClientProxyBase" Version="2022.12.0-beta3" />
<PackageReference Include="ClientProxyBase" Version="2022.12.0" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="ClientProxyBase" Version="2022.12.0-beta3" />
<PackageReference Include="ClientProxyBase" Version="2022.12.0" />
<PackageReference Include="Ductus.FluentDocker" Version="2.10.57" />
<PackageReference Include="EstateManagement.Client" Version="1.1.5" />
<PackageReference Include="EstateManagement.Client" Version="2022.12.1-build27" />
<PackageReference Include="EstateReporting.Database" Version="1.1.7" />
<PackageReference Include="EventStoreProjections" Version="1.0.13" />
<PackageReference Include="EventStoreProjections" Version="2022.12.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.0" />
<PackageReference Include="SecurityService.Client" Version="1.1.1" />
<PackageReference Include="Shared.IntegrationTesting" Version="2022.12.0-beta3" />
<PackageReference Include="SecurityService.Client" Version="2022.11.2-build28" />
<PackageReference Include="Shared.IntegrationTesting" Version="2022.12.0" />
<PackageReference Include="Shouldly" Version="4.1.0" />
<PackageReference Include="SpecFlow" Version="3.9.74" />
<PackageReference Include="SpecFlow.Tools.MsBuild.Generation" Version="3.9.74" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,34 @@ public async Task MerchantBalanceProjection_Handle_ManualDepositMadeEvent_EventI
newState.LastDeposit.ShouldBe(TestData.ManualDepositMadeEvent.DepositDateTime);
}

[Fact]
public async Task MerchantBalanceProjection_Handle_WithdrawalMadeEvent_EventIsHandled()
{
MerchantBalanceProjection projection = new MerchantBalanceProjection();
MerchantBalanceState state = new MerchantBalanceState();
state = state with
{
EstateId = TestData.EstateId,
MerchantId = TestData.MerchantId,
MerchantName = TestData.MerchantName,
AvailableBalance = 100.00m,
Balance = 100.00m,
WithdrawalCount = 0,
TotalWithdrawn = 0,
LastWithdrawal = DateTime.MinValue
};

WithdrawalMadeEvent @event = TestData.WithdrawalMadeEvent;

MerchantBalanceState newState = await projection.Handle(state, @event, CancellationToken.None);

newState.AvailableBalance.ShouldBe(state.AvailableBalance - TestData.WithdrawalMadeEvent.Amount);
newState.Balance.ShouldBe(state.Balance - TestData.WithdrawalMadeEvent.Amount);
newState.WithdrawalCount.ShouldBe(1);
newState.TotalWithdrawn.ShouldBe(TestData.WithdrawalMadeEvent.Amount);
newState.LastWithdrawal.ShouldBe(TestData.WithdrawalMadeEvent.WithdrawalDateTime);
}

[Fact]
public async Task MerchantBalanceProjection_Handle_ManualDepositMadeEvent_SecondDepositAfterFirst_EventIsHandled()
{
Expand Down
11 changes: 11 additions & 0 deletions TransactionProcessor.ProjectionEngine.Tests/TestData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,16 @@ public class TestData

public static DateTime AutomaticDepositDateTime = new DateTime(2022, 10, 13, 3, 2, 3);

public static DateTime WithdrawalDateTime = new DateTime(2022, 10, 13, 3, 2, 3);

public static Guid AutomaticDepositId = Guid.Parse("520521a1f9504ec1bf1cc5a7fd4fd905");

public static String AutomaticDepositReference = "Automatic Deposit 1";

public static Decimal AutomaticDepositAmount = 200.00m;

public static Decimal WithdrawalAmount = 100.00m;

public static Guid TransactionId = Guid.Parse("58306666-746C-4984-B264-4ECF15749BF5");

public static DateTime TransactionDateTime = new DateTime(2022, 10, 13, 7, 30, 0);
Expand Down Expand Up @@ -57,6 +61,8 @@ public class TestData
public static String ResponseCode = "ResponseCode";
public static String ResponseMessage = "ResponseMessage";

public static Guid ManualWithdrawalId = Guid.Parse("4DCDA910-53E4-40F8-AF4B-FEEAC2338739");

public static MerchantFeeAddedToTransactionEvent GetMerchantFeeAddedToTransactionEvent(Decimal calculatedFeeValue) =>
new MerchantFeeAddedToTransactionEvent(TestData.TransactionId,
TestData.EstateId,
Expand Down Expand Up @@ -104,5 +110,10 @@ public static TransactionHasBeenCompletedEvent GetTransactionHasBeenCompletedEve
new AutomaticDepositMadeEvent(TestData.MerchantId, TestData.EstateId, TestData.AutomaticDepositId,
TestData.AutomaticDepositReference, TestData.AutomaticDepositDateTime,
TestData.AutomaticDepositAmount);

public static WithdrawalMadeEvent WithdrawalMadeEvent =>
new WithdrawalMadeEvent(TestData.MerchantId, TestData.EstateId, TestData.ManualWithdrawalId,
TestData.WithdrawalDateTime,
TestData.WithdrawalAmount);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ public class MerchantBalanceProjectionState
public Decimal AvailableBalance { get; set; }
public Decimal Balance { get; init; }
public Int32 DepositCount { get; set; }
public Int32 WithdrawalCount { get; set; }
public Decimal TotalDeposited { get; set; }
public Decimal TotalWithdrawn { get; set; }

public Int32 SaleCount { get; set; }
public Decimal AuthorisedSales { get; set; }
Expand All @@ -22,6 +24,7 @@ public class MerchantBalanceProjectionState
public Decimal ValueOfFees { get; set; }

public DateTime LastDeposit { get; set; }
public DateTime LastWithdrawal { get; set; }
public DateTime LastSale { get; set; }
public DateTime LastFee { get; set; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public async Task Dispatch(MerchantBalanceState state,
MerchantCreatedEvent e => this.CreateOpeningBalanceEntry(e),
ManualDepositMadeEvent e => this.CreateManualDepositBalanceEntry(state, e),
AutomaticDepositMadeEvent e => this.CreateAutomaticDepositBalanceEntry(state, e),
WithdrawalMadeEvent e => this.CreateWithdrawalBalanceEntry(state, e),
TransactionHasBeenCompletedEvent e => this.CreateTransactionBalanceEntry(state, e),
MerchantFeeAddedToTransactionEvent e => this.CreateTransactionFeeBalanceEntry(state, e),
_ => null
Expand All @@ -33,20 +34,31 @@ public async Task Dispatch(MerchantBalanceState state,
await this.TransactionProcessorReadRepository.AddMerchantBalanceChangedEntry(entry, cancellationToken);
}

private MerchantBalanceChangedEntry CreateTransactionFeeBalanceEntry(MerchantBalanceState state, MerchantFeeAddedToTransactionEvent @event)
{
return new MerchantBalanceChangedEntry
{
MerchantId = @event.MerchantId,
EstateId = @event.EstateId,
ChangeAmount = @event.CalculatedValue,
DateTime = @event.FeeCalculatedDateTime.AddSeconds(2),
Reference = "Transaction Fee Processed",
AggregateId = @event.TransactionId,
OriginalEventId = @event.EventId,
DebitOrCredit = "C"
};
}
private MerchantBalanceChangedEntry CreateTransactionFeeBalanceEntry(MerchantBalanceState state,
MerchantFeeAddedToTransactionEvent @event) =>
new MerchantBalanceChangedEntry {
MerchantId = @event.MerchantId,
EstateId = @event.EstateId,
ChangeAmount = @event.CalculatedValue,
DateTime = @event.FeeCalculatedDateTime.AddSeconds(2),
Reference = "Transaction Fee Processed",
AggregateId = @event.TransactionId,
OriginalEventId = @event.EventId,
DebitOrCredit = "C"
};

private MerchantBalanceChangedEntry CreateWithdrawalBalanceEntry(MerchantBalanceState state,
WithdrawalMadeEvent @event) =>
new MerchantBalanceChangedEntry {
MerchantId = @event.MerchantId,
EstateId = @event.EstateId,
ChangeAmount = @event.Amount,
DateTime = @event.WithdrawalDateTime,
Reference = "Merchant Withdrawal",
AggregateId = @event.MerchantId,
OriginalEventId = @event.EventId,
DebitOrCredit = "D"
};

private MerchantBalanceChangedEntry CreateTransactionBalanceEntry(MerchantBalanceState state, TransactionHasBeenCompletedEvent @event) {
if (@event.IsAuthorised == false)
Expand Down Expand Up @@ -74,36 +86,34 @@ private MerchantBalanceChangedEntry CreateTransactionBalanceEntry(MerchantBalanc
};
}

private MerchantBalanceChangedEntry CreateManualDepositBalanceEntry(MerchantBalanceState state, ManualDepositMadeEvent @event) {
return new MerchantBalanceChangedEntry {
MerchantId = @event.MerchantId,
EstateId = @event.EstateId,
ChangeAmount = @event.Amount,
DateTime = @event.DepositDateTime,
Reference = "Merchant Deposit",
AggregateId = @event.MerchantId,
OriginalEventId = @event.EventId,
DebitOrCredit = "C"
};
}
private MerchantBalanceChangedEntry CreateManualDepositBalanceEntry(MerchantBalanceState state,
ManualDepositMadeEvent @event) =>
new MerchantBalanceChangedEntry {
MerchantId = @event.MerchantId,
EstateId = @event.EstateId,
ChangeAmount = @event.Amount,
DateTime = @event.DepositDateTime,
Reference = "Merchant Deposit",
AggregateId = @event.MerchantId,
OriginalEventId = @event.EventId,
DebitOrCredit = "C"
};

private MerchantBalanceChangedEntry CreateAutomaticDepositBalanceEntry(MerchantBalanceState state, AutomaticDepositMadeEvent @event)
{
return new MerchantBalanceChangedEntry
{
MerchantId = @event.MerchantId,
EstateId = @event.EstateId,
ChangeAmount = @event.Amount,
DateTime = @event.DepositDateTime,
Reference = "Merchant Deposit",
AggregateId = @event.MerchantId,
OriginalEventId = @event.EventId,
DebitOrCredit = "C"
};
}
private MerchantBalanceChangedEntry CreateAutomaticDepositBalanceEntry(MerchantBalanceState state,
AutomaticDepositMadeEvent @event) =>
new MerchantBalanceChangedEntry {
MerchantId = @event.MerchantId,
EstateId = @event.EstateId,
ChangeAmount = @event.Amount,
DateTime = @event.DepositDateTime,
Reference = "Merchant Deposit",
AggregateId = @event.MerchantId,
OriginalEventId = @event.EventId,
DebitOrCredit = "C"
};

private MerchantBalanceChangedEntry CreateOpeningBalanceEntry(MerchantCreatedEvent @event) {
return new MerchantBalanceChangedEntry {
private MerchantBalanceChangedEntry CreateOpeningBalanceEntry(MerchantCreatedEvent @event) =>
new MerchantBalanceChangedEntry {
MerchantId = @event.MerchantId,
EstateId = @event.EstateId,
CauseOfChangeId = @event.MerchantId,
Expand All @@ -114,5 +124,4 @@ private MerchantBalanceChangedEntry CreateOpeningBalanceEntry(MerchantCreatedEve
OriginalEventId = @event.EventId,
DebitOrCredit = "C"
};
}
}
Loading