def test_get_balance_sheet(self): self.ledger.create_account('101', 'Cash', 'asset') self.ledger.create_account('102', 'Equipment', 'asset') self.ledger.create_account('201', 'Bank Loan', 'liability') self.ledger.create_account('301', 'Share Capital', 'equity') self.ledger.record_transaction(date(2016, 9, 1), "Record the funder's investment", [('101', 500000), ('301', -500000)]) self.ledger.record_transaction(date(2016, 9, 2), "Buy a laptop", [('101', -40000), ('102', 100000), ('201', -60000)]) self.assertEqual( BalanceSheet(date=date(2016, 9, 1), asset={ Account('101', 'Cash', 'asset'): 500000, Account('102', 'Equipment', 'asset'): 0, }, liability={ Account('201', 'Bank Loan', 'liability'): 0, }, equity={ Account('301', 'Share Capital', 'equity'): -500000, }, retained_earnings=0), self.ledger.get_balance_sheet(date(2016, 9, 1)))
def test_get_balance_with_five_transactions(self): account_name = "john" account = Account(account_name) payer = "john" payee = "mary" account = Account(account_name) transaction = Transaction("2020-01-01", payer, payee, 20) account.add_transaction(transaction) transaction = Transaction("2020-01-03", payer, payee, 20) account.add_transaction(transaction) transaction = Transaction("2020-01-05", payer, payee, 20) account.add_transaction(transaction) transaction = Transaction("2020-01-22", payer, payee, 20) account.add_transaction(transaction) transaction = Transaction("2020-01-30", payer, payee, 20) account.add_transaction(transaction) self.assertEqual(account.get_balance("2020-01-02"), -20) self.assertEqual(account.get_balance("2020-01-05"), -60) self.assertEqual(account.get_balance("2020-01-06"), -60) self.assertEqual(account.get_balance("2020-01-07"), -60) self.assertEqual(account.get_balance("2020-01-21"), -60) self.assertEqual(account.get_balance("2020-01-22"), -80) self.assertEqual(account.get_balance("2020-01-23"), -80) self.assertEqual(account.get_balance("2020-01-29"), -80) self.assertEqual(account.get_balance("2020-01-30"), -100) self.assertEqual(account.get_balance("2020-01-31"), -100)
def test_add_invalid_name_transaction(self): account_name = "john" account = Account(account_name) payer = "mary" payee = "insurance" account = Account(account_name) transaction = Transaction("2020-01-22", payer, payee, 20) with self.assertRaises(AccountError): account.add_transaction(transaction)
def test_create_account_john(self): account_name = "john" account = Account(account_name) self.assertEqual(account.name, account_name) self.assertFalse(account.transactions) self.assertFalse(account.balances) self.assertEqual(account.balance, 0)
def test_get_balance_with_two_transactions(self): account_name = "john" account = Account(account_name) payer = "john" payee = "mary" account = Account(account_name) transaction = Transaction("2020-01-22", payer, payee, 20) account.add_transaction(transaction) transaction = Transaction("2020-01-25", payer, payee, 20) account.add_transaction(transaction) self.assertEqual(account.get_balance("2020-01-22"), -20) # Check balance between transactions is as expected self.assertEqual(account.get_balance("2020-01-23"), -20) # Check final balance as expected self.assertEqual(account.get_balance("2020-01-25"), -40)
def test_get_balance_with_one_transaction(self): account_name = "john" account = Account(account_name) payer = "john" payee = "mary" account = Account(account_name) transaction = Transaction("2020-01-22", payer, payee, 20) account.add_transaction(transaction) self.assertEqual(account.balance, -20) # Balance on date of transaction should be -20 self.assertEqual(account.get_balance("2020-01-22"), -20) # Balance after date of transaction should be -20 self.assertEqual(account.get_balance("2020-01-25"), -20) # Balance before first transaction - assume open and 0 self.assertEqual(account.get_balance("2015-01-21"), 0)
def test_create_account(self): self.ledger.create_account('101', 'Cash', 'asset') self.ledger.create_account('201', 'Bank Loan', 'liability') self.ledger.create_account('301', 'Share Capital', 'equity') self.ledger.create_account('401', 'Revenue', 'revenue') self.ledger.create_account('501', 'Expense', 'expense') self.assertEqual(Account('101', 'Cash', 'asset'), self.ledger.get_account('101'))
def test_get_income_statement(self): self.ledger.create_account('101', 'Cash', 'asset') self.ledger.create_account('102', 'Equipment', 'asset') self.ledger.create_account('201', 'Bank Loan', 'liability') self.ledger.create_account('301', 'Share Capital', 'equity') self.ledger.create_account('401', 'Consulting Revenue', 'revenue') self.ledger.create_account('501', 'Business Travel', 'expense') self.ledger.record_transaction(date(2016, 9, 1), "Record the funder's investment", [('101', 500000), ('301', -500000)]) self.ledger.record_transaction(date(2016, 9, 2), "Buy a laptop", [('101', -40000), ('102', 100000), ('201', -60000)]) self.ledger.record_transaction(date(2016, 9, 4), "Consulting for Acme, Inc.", [('101', 1000000), ('401', -1000000)]) self.ledger.record_transaction(date(2016, 9, 4), "Travel to Acme, Inc.", [('101', -150000), ('501', 150000)]) self.ledger.record_transaction(date(2016, 9, 14), "Implementation for Acme, Inc.", [('101', 2500000), ('401', -2500000)]) self.assertEqual( IncomeStatement( start_date=date(2016, 9, 1), end_date=date(2016, 9, 3), revenue={Account('401', 'Consulting Revenue', 'revenue'): 0}, expense={Account('501', 'Business Travel', 'expense'): 0}), self.ledger.get_income_statement(date(2016, 9, 1), date(2016, 9, 3))) self.assertEqual( IncomeStatement( start_date=date(2016, 9, 4), end_date=date(2016, 9, 13), revenue={ Account('401', 'Consulting Revenue', 'revenue'): -1000000 }, expense={Account('501', 'Business Travel', 'expense'): 150000}), self.ledger.get_income_statement(date(2016, 9, 4), date(2016, 9, 13)))
def getAccountsFromLines(lines): accountNames = set() for line in lines: _, source, _, target, _, _ = line.replace("\n", "").split(";") accountNames.add(source) accountNames.add(target) accountNames = sorted(list(accountNames), key=lambda x: len(x)) accounts = set() allAccount = Account("all") for accountName in accountNames: getAccountAndTopAccounts(accounts, accountName, allAccount) return allAccount, accounts
def getAccountAndTopAccounts(accounts, accountName, allAccount): if not ":" in accountName: topAccount = allAccount rawName = accountName else: split = accountName.split(":") top = ":".join(split[:-1]) rawName = split[-1] assert not accountName in (account.name for account in accounts) if not top in (account.name for account in accounts): topAccount = getAccountAndTopAccounts(accounts, top, allAccount) else: topAccount = next(account for account in accounts if account.name == top) account = Account(rawName) accounts.add(account) topAccount.addAccount(account) return account