Skip to content

Commit dc80bd2

Browse files
Merge pull request #390 from TransactionProcessing/task/#388_handlemerchantwithdrawal
Handle merchant withdrawal events at the balance handling
2 parents 260ed8e + fe5ec54 commit dc80bd2

File tree

28 files changed

+829
-171
lines changed

28 files changed

+829
-171
lines changed

TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
</PropertyGroup>
66

77
<ItemGroup>
8-
<PackageReference Include="EstateManagement.Client" Version="1.1.5" />
8+
<PackageReference Include="EstateManagement.Client" Version="2022.12.1-build27" />
99
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0" />
1010
<PackageReference Include="EstateReporting.Database" Version="1.1.7" />
11-
<PackageReference Include="MessagingService.Client" Version="1.1.4" />
12-
<PackageReference Include="SecurityService.Client" Version="1.1.1" />
13-
<PackageReference Include="Shared.DomainDrivenDesign" Version="2022.12.0-beta3" />
14-
<PackageReference Include="Shared.EventStore" Version="2022.12.0-beta3" />
11+
<PackageReference Include="MessagingService.Client" Version="2022.12.1-build31" />
12+
<PackageReference Include="SecurityService.Client" Version="2022.11.2-build28" />
13+
<PackageReference Include="Shared.DomainDrivenDesign" Version="2022.12.0" />
14+
<PackageReference Include="Shared.EventStore" Version="2022.12.0" />
1515
<PackageReference Include="MediatR" Version="11.0.0" />
1616
<PackageReference Include="System.IO.Abstractions" Version="17.2.3" />
1717
<PackageReference Include="System.ServiceModel.Duplex" Version="4.10.0" />

TransactionProcessor.Client/TransactionProcessor.Client.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
</PropertyGroup>
77

88
<ItemGroup>
9-
<PackageReference Include="ClientProxyBase" Version="2022.12.0-beta3" />
9+
<PackageReference Include="ClientProxyBase" Version="2022.12.0" />
1010
</ItemGroup>
1111

1212
<ItemGroup>

TransactionProcessor.IntegrationTests/TransactionProcessor.IntegrationTests.csproj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<PackageReference Include="ClientProxyBase" Version="2022.12.0-beta3" />
10+
<PackageReference Include="ClientProxyBase" Version="2022.12.0" />
1111
<PackageReference Include="Ductus.FluentDocker" Version="2.10.57" />
12-
<PackageReference Include="EstateManagement.Client" Version="1.1.5" />
12+
<PackageReference Include="EstateManagement.Client" Version="2022.12.1-build27" />
1313
<PackageReference Include="EstateReporting.Database" Version="1.1.7" />
14-
<PackageReference Include="EventStoreProjections" Version="1.0.13" />
14+
<PackageReference Include="EventStoreProjections" Version="2022.12.0" />
1515
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.0" />
1616
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0" />
1717
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.0" />
18-
<PackageReference Include="SecurityService.Client" Version="1.1.1" />
19-
<PackageReference Include="Shared.IntegrationTesting" Version="2022.12.0-beta3" />
18+
<PackageReference Include="SecurityService.Client" Version="2022.11.2-build28" />
19+
<PackageReference Include="Shared.IntegrationTesting" Version="2022.12.0" />
2020
<PackageReference Include="Shouldly" Version="4.1.0" />
2121
<PackageReference Include="SpecFlow" Version="3.9.74" />
2222
<PackageReference Include="SpecFlow.Tools.MsBuild.Generation" Version="3.9.74" />

TransactionProcessor.ProjectionEngine.Tests/MerchantBalanceProjectionTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,34 @@ public async Task MerchantBalanceProjection_Handle_ManualDepositMadeEvent_EventI
5858
newState.LastDeposit.ShouldBe(TestData.ManualDepositMadeEvent.DepositDateTime);
5959
}
6060

61+
[Fact]
62+
public async Task MerchantBalanceProjection_Handle_WithdrawalMadeEvent_EventIsHandled()
63+
{
64+
MerchantBalanceProjection projection = new MerchantBalanceProjection();
65+
MerchantBalanceState state = new MerchantBalanceState();
66+
state = state with
67+
{
68+
EstateId = TestData.EstateId,
69+
MerchantId = TestData.MerchantId,
70+
MerchantName = TestData.MerchantName,
71+
AvailableBalance = 100.00m,
72+
Balance = 100.00m,
73+
WithdrawalCount = 0,
74+
TotalWithdrawn = 0,
75+
LastWithdrawal = DateTime.MinValue
76+
};
77+
78+
WithdrawalMadeEvent @event = TestData.WithdrawalMadeEvent;
79+
80+
MerchantBalanceState newState = await projection.Handle(state, @event, CancellationToken.None);
81+
82+
newState.AvailableBalance.ShouldBe(state.AvailableBalance - TestData.WithdrawalMadeEvent.Amount);
83+
newState.Balance.ShouldBe(state.Balance - TestData.WithdrawalMadeEvent.Amount);
84+
newState.WithdrawalCount.ShouldBe(1);
85+
newState.TotalWithdrawn.ShouldBe(TestData.WithdrawalMadeEvent.Amount);
86+
newState.LastWithdrawal.ShouldBe(TestData.WithdrawalMadeEvent.WithdrawalDateTime);
87+
}
88+
6189
[Fact]
6290
public async Task MerchantBalanceProjection_Handle_ManualDepositMadeEvent_SecondDepositAfterFirst_EventIsHandled()
6391
{

TransactionProcessor.ProjectionEngine.Tests/TestData.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,16 @@ public class TestData
2222

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

25+
public static DateTime WithdrawalDateTime = new DateTime(2022, 10, 13, 3, 2, 3);
26+
2527
public static Guid AutomaticDepositId = Guid.Parse("520521a1f9504ec1bf1cc5a7fd4fd905");
2628

2729
public static String AutomaticDepositReference = "Automatic Deposit 1";
2830

2931
public static Decimal AutomaticDepositAmount = 200.00m;
3032

33+
public static Decimal WithdrawalAmount = 100.00m;
34+
3135
public static Guid TransactionId = Guid.Parse("58306666-746C-4984-B264-4ECF15749BF5");
3236

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

64+
public static Guid ManualWithdrawalId = Guid.Parse("4DCDA910-53E4-40F8-AF4B-FEEAC2338739");
65+
6066
public static MerchantFeeAddedToTransactionEvent GetMerchantFeeAddedToTransactionEvent(Decimal calculatedFeeValue) =>
6167
new MerchantFeeAddedToTransactionEvent(TestData.TransactionId,
6268
TestData.EstateId,
@@ -104,5 +110,10 @@ public static TransactionHasBeenCompletedEvent GetTransactionHasBeenCompletedEve
104110
new AutomaticDepositMadeEvent(TestData.MerchantId, TestData.EstateId, TestData.AutomaticDepositId,
105111
TestData.AutomaticDepositReference, TestData.AutomaticDepositDateTime,
106112
TestData.AutomaticDepositAmount);
113+
114+
public static WithdrawalMadeEvent WithdrawalMadeEvent =>
115+
new WithdrawalMadeEvent(TestData.MerchantId, TestData.EstateId, TestData.ManualWithdrawalId,
116+
TestData.WithdrawalDateTime,
117+
TestData.WithdrawalAmount);
107118
}
108119
}

TransactionProcessor.ProjectionEngine/Database/Entities/MerchantBalanceProjectionState.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ public class MerchantBalanceProjectionState
1212
public Decimal AvailableBalance { get; set; }
1313
public Decimal Balance { get; init; }
1414
public Int32 DepositCount { get; set; }
15+
public Int32 WithdrawalCount { get; set; }
1516
public Decimal TotalDeposited { get; set; }
17+
public Decimal TotalWithdrawn { get; set; }
1618

1719
public Int32 SaleCount { get; set; }
1820
public Decimal AuthorisedSales { get; set; }
@@ -22,6 +24,7 @@ public class MerchantBalanceProjectionState
2224
public Decimal ValueOfFees { get; set; }
2325

2426
public DateTime LastDeposit { get; set; }
27+
public DateTime LastWithdrawal { get; set; }
2528
public DateTime LastSale { get; set; }
2629
public DateTime LastFee { get; set; }
2730

TransactionProcessor.ProjectionEngine/Dispatchers/MerchantBalanceStateDispatcher.cs

Lines changed: 52 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public async Task Dispatch(MerchantBalanceState state,
2222
MerchantCreatedEvent e => this.CreateOpeningBalanceEntry(e),
2323
ManualDepositMadeEvent e => this.CreateManualDepositBalanceEntry(state, e),
2424
AutomaticDepositMadeEvent e => this.CreateAutomaticDepositBalanceEntry(state, e),
25+
WithdrawalMadeEvent e => this.CreateWithdrawalBalanceEntry(state, e),
2526
TransactionHasBeenCompletedEvent e => this.CreateTransactionBalanceEntry(state, e),
2627
MerchantFeeAddedToTransactionEvent e => this.CreateTransactionFeeBalanceEntry(state, e),
2728
_ => null
@@ -33,20 +34,31 @@ public async Task Dispatch(MerchantBalanceState state,
3334
await this.TransactionProcessorReadRepository.AddMerchantBalanceChangedEntry(entry, cancellationToken);
3435
}
3536

36-
private MerchantBalanceChangedEntry CreateTransactionFeeBalanceEntry(MerchantBalanceState state, MerchantFeeAddedToTransactionEvent @event)
37-
{
38-
return new MerchantBalanceChangedEntry
39-
{
40-
MerchantId = @event.MerchantId,
41-
EstateId = @event.EstateId,
42-
ChangeAmount = @event.CalculatedValue,
43-
DateTime = @event.FeeCalculatedDateTime.AddSeconds(2),
44-
Reference = "Transaction Fee Processed",
45-
AggregateId = @event.TransactionId,
46-
OriginalEventId = @event.EventId,
47-
DebitOrCredit = "C"
48-
};
49-
}
37+
private MerchantBalanceChangedEntry CreateTransactionFeeBalanceEntry(MerchantBalanceState state,
38+
MerchantFeeAddedToTransactionEvent @event) =>
39+
new MerchantBalanceChangedEntry {
40+
MerchantId = @event.MerchantId,
41+
EstateId = @event.EstateId,
42+
ChangeAmount = @event.CalculatedValue,
43+
DateTime = @event.FeeCalculatedDateTime.AddSeconds(2),
44+
Reference = "Transaction Fee Processed",
45+
AggregateId = @event.TransactionId,
46+
OriginalEventId = @event.EventId,
47+
DebitOrCredit = "C"
48+
};
49+
50+
private MerchantBalanceChangedEntry CreateWithdrawalBalanceEntry(MerchantBalanceState state,
51+
WithdrawalMadeEvent @event) =>
52+
new MerchantBalanceChangedEntry {
53+
MerchantId = @event.MerchantId,
54+
EstateId = @event.EstateId,
55+
ChangeAmount = @event.Amount,
56+
DateTime = @event.WithdrawalDateTime,
57+
Reference = "Merchant Withdrawal",
58+
AggregateId = @event.MerchantId,
59+
OriginalEventId = @event.EventId,
60+
DebitOrCredit = "D"
61+
};
5062

5163
private MerchantBalanceChangedEntry CreateTransactionBalanceEntry(MerchantBalanceState state, TransactionHasBeenCompletedEvent @event) {
5264
if (@event.IsAuthorised == false)
@@ -74,36 +86,34 @@ private MerchantBalanceChangedEntry CreateTransactionBalanceEntry(MerchantBalanc
7486
};
7587
}
7688

77-
private MerchantBalanceChangedEntry CreateManualDepositBalanceEntry(MerchantBalanceState state, ManualDepositMadeEvent @event) {
78-
return new MerchantBalanceChangedEntry {
79-
MerchantId = @event.MerchantId,
80-
EstateId = @event.EstateId,
81-
ChangeAmount = @event.Amount,
82-
DateTime = @event.DepositDateTime,
83-
Reference = "Merchant Deposit",
84-
AggregateId = @event.MerchantId,
85-
OriginalEventId = @event.EventId,
86-
DebitOrCredit = "C"
87-
};
88-
}
89+
private MerchantBalanceChangedEntry CreateManualDepositBalanceEntry(MerchantBalanceState state,
90+
ManualDepositMadeEvent @event) =>
91+
new MerchantBalanceChangedEntry {
92+
MerchantId = @event.MerchantId,
93+
EstateId = @event.EstateId,
94+
ChangeAmount = @event.Amount,
95+
DateTime = @event.DepositDateTime,
96+
Reference = "Merchant Deposit",
97+
AggregateId = @event.MerchantId,
98+
OriginalEventId = @event.EventId,
99+
DebitOrCredit = "C"
100+
};
89101

90-
private MerchantBalanceChangedEntry CreateAutomaticDepositBalanceEntry(MerchantBalanceState state, AutomaticDepositMadeEvent @event)
91-
{
92-
return new MerchantBalanceChangedEntry
93-
{
94-
MerchantId = @event.MerchantId,
95-
EstateId = @event.EstateId,
96-
ChangeAmount = @event.Amount,
97-
DateTime = @event.DepositDateTime,
98-
Reference = "Merchant Deposit",
99-
AggregateId = @event.MerchantId,
100-
OriginalEventId = @event.EventId,
101-
DebitOrCredit = "C"
102-
};
103-
}
102+
private MerchantBalanceChangedEntry CreateAutomaticDepositBalanceEntry(MerchantBalanceState state,
103+
AutomaticDepositMadeEvent @event) =>
104+
new MerchantBalanceChangedEntry {
105+
MerchantId = @event.MerchantId,
106+
EstateId = @event.EstateId,
107+
ChangeAmount = @event.Amount,
108+
DateTime = @event.DepositDateTime,
109+
Reference = "Merchant Deposit",
110+
AggregateId = @event.MerchantId,
111+
OriginalEventId = @event.EventId,
112+
DebitOrCredit = "C"
113+
};
104114

105-
private MerchantBalanceChangedEntry CreateOpeningBalanceEntry(MerchantCreatedEvent @event) {
106-
return new MerchantBalanceChangedEntry {
115+
private MerchantBalanceChangedEntry CreateOpeningBalanceEntry(MerchantCreatedEvent @event) =>
116+
new MerchantBalanceChangedEntry {
107117
MerchantId = @event.MerchantId,
108118
EstateId = @event.EstateId,
109119
CauseOfChangeId = @event.MerchantId,
@@ -114,5 +124,4 @@ private MerchantBalanceChangedEntry CreateOpeningBalanceEntry(MerchantCreatedEve
114124
OriginalEventId = @event.EventId,
115125
DebitOrCredit = "C"
116126
};
117-
}
118127
}

0 commit comments

Comments
 (0)