def test_canceled_payments_are_not_returned(self): txns = [ {'date': '2014/04/14', "payee": "Bank A", "amount": 10.00}, {'date': '2014/05/14', "payee": "Bank A", "amount": 10.00}, {'date': '2014/06/14', "payee": "Bank A", "amount": 10.00}, ] result = find_recurring_transactions(txns, datetime.datetime(2014, 8, 15)) self.assertEqual(0, len(result))
def test_returns_multiple_tx_for_same_payee(self): txns = [ {'date': '2014/09/14', "payee": "Bank A", "amount": 10.00}, {'date': '2014/10/14', "payee": "Bank A", "amount": 10.00}, {'date': '2014/11/14', "payee": "Bank A", "amount": 10.00}, ] result = find_recurring_transactions(txns, datetime.datetime(2014, 11, 14)) self.assertEqual(1, len(result))
def test_does_return_3_transactions_with_one_different_amount(self): txns = [ {'date': '2014/09/14', "payee": "Bank A", "amount": 10.00}, {'date': '2014/10/14', "payee": "Bank A", "amount": 10.00}, {'date': '2014/11/14', "payee": "Bank A", "amount": 5.00}, ] result = find_recurring_transactions(txns, datetime.datetime(2014, 11, 14)) self.assertEqual(1, len(result))
def test_does_return_3_transactions_with_one_different_amount(self): txns = [ { 'date': '2014/09/14', "payee": "Bank A", "amount": 10.00 }, { 'date': '2014/10/14', "payee": "Bank A", "amount": 10.00 }, { 'date': '2014/11/14', "payee": "Bank A", "amount": 5.00 }, ] result = find_recurring_transactions(txns, datetime.datetime(2014, 11, 14)) self.assertEqual(1, len(result))
def test_returns_multiple_tx_for_same_payee(self): txns = [ { 'date': '2014/09/14', "payee": "Bank A", "amount": 10.00 }, { 'date': '2014/10/14', "payee": "Bank A", "amount": 10.00 }, { 'date': '2014/11/14', "payee": "Bank A", "amount": 10.00 }, ] result = find_recurring_transactions(txns, datetime.datetime(2014, 11, 14)) self.assertEqual(1, len(result))
def test_canceled_payments_are_not_returned(self): txns = [ { 'date': '2014/04/14', "payee": "Bank A", "amount": 10.00 }, { 'date': '2014/05/14', "payee": "Bank A", "amount": 10.00 }, { 'date': '2014/06/14', "payee": "Bank A", "amount": 10.00 }, ] result = find_recurring_transactions(txns, datetime.datetime(2014, 8, 15)) self.assertEqual(0, len(result))
def index(): layout = Dashboard() layout.current_date = current_date() layout.accounts = [{ "name": format_account(account), 'balance': format_amount(balance) } for account, cur, balance in l.balance( accounts=s.Accounts.ASSETS_PATTERN)] layout.debts = [{ "name": format_account(account), 'balance': format_amount(float(balance) * -1) } for account, cur, balance in l.balance( accounts=s.Accounts.LIABILITIES_PATTERN)] layout.expense_balances = [{ "name": format_account(account), 'balance': format_amount(balance), "first": account == s.Accounts.EXPENSES_PATTERN } for account, cur, balance in l.balance( accounts=s.Accounts.EXPENSES_PATTERN, limit="date >= [{}]".format(current_date().strftime("%B")))] previous_month = current_datetime() - relativedelta(month=1) layout.expenses_previous_month = [{ "name": format_account(account), 'balance': format_amount(balance), "first": ":" not in account } for account, cur, balance in l.balance( accounts=s.Accounts.EXPENSES_PATTERN, limit="date >= [{}] and date < [{}]".format( previous_month.strftime("%B %Y"), current_date().strftime("%B %Y")))] recurring_income = ledger.find_recurring_transactions( l.register(accounts=s.Accounts.INCOME_PATTERN), current_datetime()) layout.income = [{ "name": format_account(txn['payee']), 'balance': format_amount(float(txn['amount']) * -1) } for txn in recurring_income] layout.last_expenses = [{ 'payee': txn['payee'], 'note': txn['note'], 'amount': format_amount(txn['amount']) } for txn in l.register(accounts=s.Accounts.EXPENSES_PATTERN)[:-15:-1]] recurring_transactions = ledger.find_recurring_transactions( l.register(accounts=s.Accounts.EXPENSES_PATTERN), current_datetime()) transactions_this_month = l.register(accounts=s.Accounts.EXPENSES_PATTERN, limit='date >= [{}]'.format( current_date().strftime("%B"))) for txn in recurring_transactions: txn['date'] = current_datetime().strptime(txn['date'], '%Y/%m/%d') # unpayed_transactions = get_unmatched_txns(recurring_transactions, transactions_this_month) total = float(0) for txn in recurring_transactions: total += float(txn['amount']) recurring_transactions = [ { "payee": txn['payee'], "due_in": days_until_next_transaction(txn['date']), "amount": format_amount(txn['amount'], width=3) } for txn in recurring_transactions # unpayed_transactions ] layout.recurring_transactions = sorted(recurring_transactions, key=lambda item: item['due_in']) layout.recurring_transactions_total = format_amount(total) current_month = current_date().month flow = [] for i in range(current_month - 3, current_month + 1): start_year = end_year = current_date().year start_month_nr = i % 12 end_month_nr = (i + 1) % 12 if i < 1: start_year -= 1 if i > 11: end_year += 1 result = l.register(accounts=" ".join( [s.Accounts.EXPENSES_PATTERN, s.Accounts.INCOME_PATTERN]), M=True, collapse=True, limit="date >= [{} {}] and date < [{} {}]".format( months[start_month_nr], start_year, months[end_month_nr], end_year)) amount = float(result[0]['amount']) * -1 if len(result) > 0 else 0 flow.append({ 'month': months[start_month_nr], 'amount': format_amount(amount), 'type': "negative" if amount < 0 else "positive" }) layout.cash_flow = flow return renderer.render(layout)
def index(): layout = Dashboard() layout.current_date = current_date() layout.accounts = [ {"name": format_account(account), "balance": format_amount(balance)} for account, cur, balance in l.balance(accounts=s.Accounts.ASSETS_PATTERN) ] layout.debts = [ {"name": format_account(account), "balance": format_amount(float(balance) * -1)} for account, cur, balance in l.balance(accounts=s.Accounts.LIABILITIES_PATTERN) ] layout.expense_balances = [ { "name": format_account(account), "balance": format_amount(balance), "first": account == s.Accounts.EXPENSES_PATTERN, } for account, cur, balance in l.balance( accounts=s.Accounts.EXPENSES_PATTERN, limit="date >= [{}]".format(current_date().strftime("%B")) ) ] previous_month = current_datetime() - relativedelta(month=1) layout.expenses_previous_month = [ {"name": format_account(account), "balance": format_amount(balance), "first": ":" not in account} for account, cur, balance in l.balance( accounts=s.Accounts.EXPENSES_PATTERN, limit="date >= [{}] and date < [{}]".format( previous_month.strftime("%B %Y"), current_date().strftime("%B %Y") ), ) ] recurring_income = ledger.find_recurring_transactions( l.register(accounts=s.Accounts.INCOME_PATTERN), current_datetime() ) layout.income = [ {"name": format_account(txn["payee"]), "balance": format_amount(float(txn["amount"]) * -1)} for txn in recurring_income ] layout.last_expenses = [ {"payee": txn["payee"], "note": txn["note"], "amount": format_amount(txn["amount"])} for txn in l.register(accounts=s.Accounts.EXPENSES_PATTERN)[:-15:-1] ] recurring_transactions = ledger.find_recurring_transactions( l.register(accounts=s.Accounts.EXPENSES_PATTERN), current_datetime() ) transactions_this_month = l.register( accounts=s.Accounts.EXPENSES_PATTERN, limit="date >= [{}]".format(current_date().strftime("%B")) ) for txn in recurring_transactions: txn["date"] = current_datetime().strptime(txn["date"], "%Y/%m/%d") # unpayed_transactions = get_unmatched_txns(recurring_transactions, transactions_this_month) total = float(0) for txn in recurring_transactions: total += float(txn["amount"]) recurring_transactions = [ { "payee": txn["payee"], "due_in": days_until_next_transaction(txn["date"]), "amount": format_amount(txn["amount"], width=3), } for txn in recurring_transactions # unpayed_transactions ] layout.recurring_transactions = sorted(recurring_transactions, key=lambda item: item["due_in"]) layout.recurring_transactions_total = format_amount(total) current_month = current_date().month flow = [] for i in range(current_month - 3, current_month + 1): start_year = end_year = current_date().year start_month_nr = i % 12 end_month_nr = (i + 1) % 12 if i < 1: start_year -= 1 if i > 11: end_year += 1 result = l.register( accounts=" ".join([s.Accounts.EXPENSES_PATTERN, s.Accounts.INCOME_PATTERN]), M=True, collapse=True, limit="date >= [{} {}] and date < [{} {}]".format( months[start_month_nr], start_year, months[end_month_nr], end_year ), ) amount = float(result[0]["amount"]) * -1 if len(result) > 0 else 0 flow.append( { "month": months[start_month_nr], "amount": format_amount(amount), "type": "negative" if amount < 0 else "positive", } ) layout.cash_flow = flow return renderer.render(layout)
def test_multiple_transactions_over_longer_period_are_not_returned(self, txns): result = find_recurring_transactions(txns, datetime.datetime(2014, 10, 1)) self.assertEqual(0, len(result))
def test_payments_off_by_week_are_returned(self, txns): result = find_recurring_transactions(txns, datetime.datetime(2014, 7, 14)) self.assertEqual(1, len(result))
def test_multiple_transactions_over_longer_period_are_not_returned( self, txns): result = find_recurring_transactions(txns, datetime.datetime(2014, 10, 1)) self.assertEqual(0, len(result))