public async Task when_an_entry_is_posted( GeneralLedgerEntryIdentifier generalLedgerEntryIdentifier, LocalDateTime createdOn, Money[] amounts) { var period = AccountingPeriod.Open(createdOn.Date); var thru = createdOn.Date.PlusDays(1).AtMidnight(); var accounts = await OpenBooks(createdOn).ToArrayAsync(); var debits = Array.ConvertAll(amounts, amount => new Debit(accounts.OrderBy(_ => Guid.NewGuid()).First().accountNumber, amount)); var credits = Array.ConvertAll(amounts, amount => new Credit(accounts.OrderBy(_ => Guid.NewGuid()).First().accountNumber, amount)); var journalEntry = new JournalEntry { ReferenceNumber = 1, Credits = Array.ConvertAll(credits, credit => new JournalEntry.Item { Amount = credit.Amount.ToDecimal(), AccountNumber = credit.AccountNumber.Value }), Debits = Array.ConvertAll(debits, debit => new JournalEntry.Item { Amount = debit.Amount.ToDecimal(), AccountNumber = debit.AccountNumber.ToInt32() }) }; var command = new PostGeneralLedgerEntry { GeneralLedgerEntryId = generalLedgerEntryIdentifier.ToGuid(), CreatedOn = createdOn.ToDateTimeUnspecified(), BusinessTransaction = journalEntry, Period = period.ToString() }; var expected = new BalanceSheetReport { Thru = thru.ToDateTimeUnspecified(), LineItems = journalEntry.Debits.Concat(journalEntry.Credits.Select(c => new JournalEntry.Item() { Amount = -c.Amount, AccountNumber = c.AccountNumber })).Aggregate(ImmutableDictionary <int, LineItem> .Empty, (items, item) => items.SetItem( item.AccountNumber, new LineItem { AccountNumber = item.AccountNumber, Name = accounts.Single(x => x.accountNumber.ToInt32() == item.AccountNumber).accountName .ToString(), Balance = items.TryGetValue(item.AccountNumber, out var existing) ? existing.Balance + item.Amount : new () { DecimalValue = item.Amount } })).Values.OrderBy(x => x.AccountNumber).ToImmutableArray(),
public async ValueTask Handle(PostGeneralLedgerEntry command, CancellationToken cancellationToken = default) { var generalLedger = await _generalLedger.Get(cancellationToken); if (command.BusinessTransaction == null) { throw new NotImplementedException(); } var entry = generalLedger.Create(new GeneralLedgerEntryIdentifier(command.GeneralLedgerEntryId), command.BusinessTransaction.ReferenceNumber, OffsetDateTime.FromDateTimeOffset(command.CreatedOn).LocalDateTime); command.BusinessTransaction.Apply(entry, _accountIsDeactivated); entry.Post(); _generalLedgerEntries.Add(entry); }
public async ValueTask Handle(PostGeneralLedgerEntry command, CancellationToken cancellationToken = default) { if (command.BusinessTransaction == null) { throw new InvalidOperationException(); } var generalLedger = await _generalLedger.Get(cancellationToken); var chartOfAccounts = await _chartOfAccounts.Get(cancellationToken); var entry = generalLedger.Create(new GeneralLedgerEntryIdentifier(command.GeneralLedgerEntryId), command.BusinessTransaction.ReferenceNumber, command.CreatedOn); command.BusinessTransaction.Apply(entry, chartOfAccounts); entry.Post(); _generalLedgerEntries.Add(entry); }
public async Task when_an_entry_is_posted( GeneralLedgerEntryIdentifier generalLedgerEntryIdentifier, DateTimeOffset createdOn, Money[] amounts) { var period = Period.Open(createdOn); var accounts = await OpenBooks(createdOn).ToArrayAsync(); var debits = Array.ConvertAll(amounts, amount => new Debit(accounts.OrderBy(_ => Guid.NewGuid()).First().accountNumber, amount)); var credits = Array.ConvertAll(amounts, amount => new Credit(accounts.OrderBy(_ => Guid.NewGuid()).First().accountNumber, amount)); var command = new PostGeneralLedgerEntry { GeneralLedgerEntryId = generalLedgerEntryIdentifier.ToGuid(), CreatedOn = createdOn, BusinessTransaction = new JournalEntry { ReferenceNumber = 1, Credits = Array.ConvertAll(credits, credit => new JournalEntry.Item { Amount = credit.Amount.ToDecimal(), AccountNumber = credit.AccountNumber.Value }), Debits = Array.ConvertAll(debits, debit => new JournalEntry.Item { Amount = debit.Amount.ToDecimal(), AccountNumber = debit.AccountNumber.ToInt32() }) }, Period = period.ToString() }; await HttpClient.SendCommand("/general-ledger/entries", command, TransactoSerializerOptions.BusinessTransactions(typeof(JournalEntry))); await Task.Delay(TimeSpan.FromSeconds(2)); using var response = await HttpClient.GetAsync($"/balance-sheet/{createdOn.AddDays(1):O}"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var json = await response.Content.ReadAsStringAsync(); var balanceSheet = JsonSerializer.Deserialize <BalanceSheetReport>(json, TransactoSerializerOptions.Events); }