Added journal reversals.
This commit is contained in:
@@ -19,21 +19,16 @@ public static class ReverseJournalHandler
|
|||||||
public static async Task<ReversalData?> LoadAsync(ReverseJournalCommand cmd, IReversalQuery query)
|
public static async Task<ReversalData?> LoadAsync(ReverseJournalCommand cmd, IReversalQuery query)
|
||||||
{
|
{
|
||||||
var data = await query.GetReversalDataAsync(cmd.OriginalJournalId);
|
var data = await query.GetReversalDataAsync(cmd.OriginalJournalId);
|
||||||
if (data == null)
|
return data ?? throw new InvalidOperationException($"Journal Entry {cmd.OriginalJournalId} does not exist");
|
||||||
{
|
|
||||||
throw new InvalidOperationException($"Journal Entry {cmd.OriginalJournalId} does not exist");
|
|
||||||
}
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (
|
public static (
|
||||||
IStorageAction<JournalEntry> ReversalWrite,
|
IStorageAction<JournalEntry> JournalWrite,
|
||||||
IStorageAction<Account>[] AccountWrites,
|
UnitOfWork<Account> AccountWrites,
|
||||||
JournalReversedEvent Event) Handle(ReverseJournalCommand cmd, ReversalData data)
|
JournalReversedEvent Event) Handle(ReverseJournalCommand cmd, ReversalData data)
|
||||||
{
|
{
|
||||||
var reversalJournal =
|
var reversalJournal =
|
||||||
BalancedJournal.CreateReversal(data.OriginalJournalEntry, cmd.Reason, DateTimeOffset.UtcNow);
|
BalancedJournal.CreateReversal(data.OriginalJournalEntry, $"Reversal: {cmd.Reason}", DateTimeOffset.UtcNow);
|
||||||
var accountState = data.AffectedAccounts.ToDictionary(a => a.Id);
|
var accountState = data.AffectedAccounts.ToDictionary(a => a.Id);
|
||||||
|
|
||||||
reversalJournal.Entry.Lines.ForEach(l =>
|
reversalJournal.Entry.Lines.ForEach(l =>
|
||||||
@@ -41,11 +36,14 @@ public static class ReverseJournalHandler
|
|||||||
var currentAccount = accountState[l.AccountId];
|
var currentAccount = accountState[l.AccountId];
|
||||||
accountState[l.AccountId] = currentAccount.ApplyPosting(l.Amount, l.Type);
|
accountState[l.AccountId] = currentAccount.ApplyPosting(l.Amount, l.Type);
|
||||||
});
|
});
|
||||||
|
var accountUow = new UnitOfWork<Account>();
|
||||||
var accountWrites = accountState.Values.Select(a => (IStorageAction<Account>)Storage.Update(a)).ToArray();
|
foreach (var account in accountState.Values)
|
||||||
|
{
|
||||||
|
accountUow.Update(account);
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
Storage.Insert(reversalJournal.Entry),
|
Storage.Insert(reversalJournal.Entry),
|
||||||
accountWrites,
|
accountUow,
|
||||||
new JournalReversedEvent(cmd.OriginalJournalId, reversalJournal.Entry.Id)
|
new JournalReversedEvent(cmd.OriginalJournalId, reversalJournal.Entry.Id)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,11 @@ public class DomainExceptionHandler : IExceptionHandler
|
|||||||
Exception exception,
|
Exception exception,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
// Only intercept our specific domain/validation exceptions
|
if (exception is not (InvalidOperationException or ArgumentException))
|
||||||
if (exception is InvalidOperationException or ArgumentException)
|
|
||||||
{
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
var problemDetails = new ProblemDetails
|
var problemDetails = new ProblemDetails
|
||||||
{
|
{
|
||||||
Status = StatusCodes.Status400BadRequest,
|
Status = StatusCodes.Status400BadRequest,
|
||||||
@@ -25,8 +27,6 @@ public class DomainExceptionHandler : IExceptionHandler
|
|||||||
await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken);
|
await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,7 +22,7 @@ Content-Type: application/json
|
|||||||
{
|
{
|
||||||
"sourceAccountId": 1,
|
"sourceAccountId": 1,
|
||||||
"destinationAccountId": 2,
|
"destinationAccountId": 2,
|
||||||
"amount": 3000.00
|
"amount": 1000.00
|
||||||
}
|
}
|
||||||
|
|
||||||
### Reverse a Journal Entry
|
### Reverse a Journal Entry
|
||||||
@@ -31,6 +31,6 @@ POST {{FinancialApi_HostAddress}}/journal/reverse
|
|||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
|
|
||||||
{
|
{
|
||||||
"originalJournalId": "AD4FC011-9979-4364-A0D4-2CCD922ECB5E",
|
"originalJournalId": "3E829F92-E2FA-4FCD-9B7B-E1B5AAC96FF1",
|
||||||
"reason": "Incorrect Account"
|
"reason": "Incorrect Account Fee"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user