public DtoToLedgerTransactionMapperTest()
 {
     TestData = new LedgerTransactionDto
     {
         Id              = TransactionId,
         Amount          = -123.99M,
         Narrative       = "Foo bar.",
         TransactionType = typeof(CreditLedgerTransaction).FullName
     };
 }
        public void ShouldMapAccountTypeForBalanceAdjustmentTransaction()
        {
            TestData = new LedgerTransactionDto
            {
                Id              = TransactionId,
                Amount          = -123.99M,
                Narrative       = "Foo bar.",
                Account         = StatementModelTestData.ChequeAccount.Name,
                TransactionType = typeof(BankBalanceAdjustmentTransaction).FullName
            };
            var subject = new Mapper_LedgerTransactionDto_LedgerTransaction(new LedgerTransactionFactory(), new InMemoryAccountTypeRepository());

            Result = subject.ToModel(TestData);

            Assert.AreEqual(StatementModelTestData.ChequeAccount.Name, ((BankBalanceAdjustmentTransaction)Result).BankAccount.Name);
        }
        public async Task <LedgerTransactionDto> EditLedgerTransactionAsync(LedgerTransactionDto transactionDto)
        {
            var transaction = await _db.Transactions.FirstOrDefaultAsync(x => x.TransactionId == transactionDto.TransactionId);

            var originalAmount          = transaction.Amount;
            var originalTransactionType = transaction.TransactionType;

            var account = await _db.Accounts.SingleOrDefaultAsync(x => x.AccountId == transactionDto.AccountId);

            transaction.Amount           = transactionDto.Amount;
            transaction.TransactionType  = transactionDto.TransactionType;
            _db.Entry(transaction).State = EntityState.Modified;

            account.RemoveTransactionAmountFromBalance(originalAmount, originalTransactionType);
            account.UpdateBalance(transaction);

            _db.Entry(account).State = EntityState.Modified;
            await _db.SaveChangesAsync();

            return(transactionDto);
        }
        public async Task <LedgerTransactionDto> AddLedgerTransactionAsync(LedgerTransactionDto transactionDto)
        {
            var account = await _db.Accounts.SingleOrDefaultAsync(x => x.AccountId == transactionDto.AccountId);

            var transaction = new LedgerTransaction()
            {
                Amount             = transactionDto.Amount,
                DateTimeCreatedUTC = transactionDto.DateTimeCreatedUTC,
                TransactionType    = transactionDto.TransactionType
            };

            account.Transactions.Add(transaction);
            account.UpdateBalance(transaction);

            _db.Entry(account).State = EntityState.Modified;
            await _db.SaveChangesAsync();

            transactionDto.TransactionId = transaction.TransactionId;

            return(transactionDto);
        }