예제 #1
0
        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);
        }
예제 #4
0
        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);
        }