diff --git a/bpfin/financials/balance_sheet_projection.py b/bpfin/financials/balance_sheet_projection.py index 60a68dad652094ed97504c252e636b3c87366196..54d8dcd5b2a55797f9808860a7de6504775858b9 100644 --- a/bpfin/financials/balance_sheet_projection.py +++ b/bpfin/financials/balance_sheet_projection.py @@ -2,12 +2,12 @@ import datetime def balance_sheet_projection(cash_balance, liability, - income_statement_projection, analysis_date): + noi_dict, analysis_date): """Return balance sheet projection. Args: cash_balance (dictionary): {year:value}, cash per year liability (dictionary): {(year):value} value can be mortgage, loan debt, etc - income_statement_projection (dictionary): {year:income statement values - take NOI} + noi_dict (dictionary): {year:income statement values - take NOI} analysis_date (dictionary): proforma's starting date and the years of proforma Returns: dictionary: {year: balance sheet cash available} @@ -44,8 +44,8 @@ def balance_sheet_projection(cash_balance, liability, liability_value = liability[an_year] else: liability_value = 0 - if an_year in income_statement_projection: - noi = income_statement_projection[an_year]['noi'] + if an_year in noi_dict: + noi = noi_dict[an_year] else: noi = 0 analysis_years[an_year] = cash_b - liability_value + noi diff --git a/bpfin/financials/financial_lib.py b/bpfin/financials/financial_lib.py index f9c22cc46649fe8485339bd4037dfb0b8e0484fd..118079960ed652e80b542056d721d67f7e5dd735 100644 --- a/bpfin/financials/financial_lib.py +++ b/bpfin/financials/financial_lib.py @@ -1,10 +1,11 @@ -# import datetime -# import calendar +import datetime +import calendar import copy from bpfin.lib import other as lib from bpfin.utilbills.bill_lib import form_bill_year from numpy import mean from bpfin.tests.testdata import sample_data as db + # import bpfin.utilbills.bill_lib as bl # import pprint @@ -141,23 +142,28 @@ class Income_Statement(): self.water_opex = annual_bills['water'] self.energy_opex = self.electricity_opex + self.gas_opex + self.oil_opex + self.water_opex self.other_utility = self.revenue * characters['other_utility_percent'] - self.non_utility_expense = self.revenue * characters['non_utility_expense_percent'] + self.non_utility_expense = self.revenue * characters[ + 'non_utility_expense_percent'] self.utility_expense = self.energy_opex + self.other_utility self.net_non_energy_opex = self.other_utility + self.non_utility_expense self.total_opex = self.energy_opex + self.net_non_energy_opex self.noi = self.revenue - self.total_opex - def assign_next(self, income_statement_characters, bill_overview_organized): + def assign_next(self, income_statement_characters, + bill_overview_organized): """ !!! this function will be deleted in the next version!! """ - self.electricity_opex = bill_overview_organized['electricity'][self.year] + self.electricity_opex = bill_overview_organized['electricity'][ + self.year] self.gas_opex = bill_overview_organized['gas'][self.year] self.oil_opex = bill_overview_organized['oil'][self.year] self.water_opex = bill_overview_organized['water'][self.year] self.energy_opex = self.electricity_opex + self.gas_opex + self.oil_opex + self.water_opex - self.other_utility = self.revenue * income_statement_characters['other_utility_percent'] - self.non_utility_expense = self.revenue * income_statement_characters['non_utility_expense_percent'] + self.other_utility = self.revenue * income_statement_characters[ + 'other_utility_percent'] + self.non_utility_expense = self.revenue * income_statement_characters[ + 'non_utility_expense_percent'] self.utility_expense = self.energy_opex + self.other_utility self.net_non_energy_opex = self.other_utility + self.non_utility_expense self.total_opex = self.energy_opex + self.net_non_energy_opex @@ -198,7 +204,8 @@ def convert_income_statement_class(income_statement_class): 'non_utility_expense': income_statement_class.non_utility_expense, 'net_non_energy_opex': income_statement_class.net_non_energy_opex, 'total_opex': income_statement_class.total_opex, - 'noi': income_statement_class.noi} + 'noi': income_statement_class.noi + } return income_statement_dict @@ -207,7 +214,9 @@ class Income_Statement_Next(): Create single year income_statement objective, with input of last year data, income statement characters, and projected annual bill """ - def __init__(self, year, last_revenue, growth_rate_flag, characters, annual_bill_table): + + def __init__(self, year, last_revenue, growth_rate_flag, characters, + annual_bill_table): """ Calculation is done in initiation. Args: @@ -247,7 +256,8 @@ class Income_Statement_Next(): self.water_opex = annual_bill_table['water'][self.year] self.energy_opex = self.electricity_opex + self.gas_opex + self.oil_opex + self.water_opex self.other_utility = self.revenue * characters['other_utility_percent'] - self.non_utility_expense = self.revenue * characters['non_utility_expense_percent'] + self.non_utility_expense = self.revenue * characters[ + 'non_utility_expense_percent'] self.utility_expense = self.energy_opex + self.other_utility self.net_non_energy_opex = self.other_utility + self.non_utility_expense self.total_opex = self.energy_opex + self.net_non_energy_opex @@ -261,6 +271,7 @@ class Income_Statement_Table(): hist_table (list): list of single year income_statement objectives, containing historical data table(list): list of single year income_statement objectives, containing historical and projected data """ + def __init__(self, raw_income_input, annual_bill_table): """ Create hist_table to store historical income statement data, and calculate some key characters. @@ -301,7 +312,8 @@ class Income_Statement_Table(): for year in raw_income_input: current_income_statement = Income_Statement() - current_income_statement.put_hist(year, raw_income_input[year], annual_bill_table) + current_income_statement.put_hist(year, raw_income_input[year], + annual_bill_table) self.hist_table.append(current_income_statement) sorted_income_hist_year = sorted(raw_income_input) @@ -321,9 +333,10 @@ class Income_Statement_Table(): other_utility_sum += current_income_statement.other_utility non_utility_expense_sum += current_income_statement.non_utility_expense - self.other_utility_percent = other_utility_sum/revenue_sum - self.non_utility_expense_percent = non_utility_expense_sum/revenue_sum - self.revenue_average = revenue_sum / (self.hist_end_year - self.hist_start_year + 1) + self.other_utility_percent = other_utility_sum / revenue_sum + self.non_utility_expense_percent = non_utility_expense_sum / revenue_sum + self.revenue_average = revenue_sum / ( + self.hist_end_year - self.hist_start_year + 1) self.table = self.hist_table self.characters = { @@ -332,7 +345,8 @@ class Income_Statement_Table(): 'cagr': self.cagr, 'other_utility_percent': self.other_utility_percent, 'non_utility_expense_percent': self.non_utility_expense_percent, - 'revenue_average': self.revenue_average} + 'revenue_average': self.revenue_average + } def project(self, growth_rate_flag, analysis_date, annual_bill_table): """ @@ -355,7 +369,8 @@ class Income_Statement_Table(): if year <= current_table[-1].year: continue current_income_statement = Income_Statement_Next( - year, last_revenue, growth_rate_flag, self.characters, annual_bill_table) + year, last_revenue, growth_rate_flag, self.characters, + annual_bill_table) current_table.append(current_income_statement) # print(current_income_statement.revenue, current_income_statement.noi) self.table = current_table @@ -372,19 +387,33 @@ class Income_Statement_Table(): hist_table_dict = {} for current_income_statement in self.hist_table: hist_table_dict[current_income_statement.year] = { - 'year': current_income_statement.year, - 'revenue': current_income_statement.revenue, - 'utility_expense': current_income_statement.utility_expense, - 'energy_opex': current_income_statement.energy_opex, - 'electricity_opex': current_income_statement.electricity_opex, - 'gas_opex': current_income_statement.gas_opex, - 'oil_opex': current_income_statement.oil_opex, - 'water_opex': current_income_statement.water_opex, - 'other_utility': current_income_statement.other_utility, - 'non_utility_expense': current_income_statement.non_utility_expense, - 'net_non_energy_opex': current_income_statement.net_non_energy_opex, - 'total_opex': current_income_statement.total_opex, - 'noi': current_income_statement.noi} + 'year': + current_income_statement.year, + 'revenue': + current_income_statement.revenue, + 'utility_expense': + current_income_statement.utility_expense, + 'energy_opex': + current_income_statement.energy_opex, + 'electricity_opex': + current_income_statement.electricity_opex, + 'gas_opex': + current_income_statement.gas_opex, + 'oil_opex': + current_income_statement.oil_opex, + 'water_opex': + current_income_statement.water_opex, + 'other_utility': + current_income_statement.other_utility, + 'non_utility_expense': + current_income_statement.non_utility_expense, + 'net_non_energy_opex': + current_income_statement.net_non_energy_opex, + 'total_opex': + current_income_statement.total_opex, + 'noi': + current_income_statement.noi + } return hist_table_dict def get_cagr(self): @@ -407,12 +436,17 @@ class Income_Statement_Table(): current_income_statement = Income_Statement() average_revenue = mean(list(i_s.revenue for i_s in self.hist_table)) annual_bills = { - 'electricity': mean(list(i_s.electricity_opex for i_s in self.hist_table)), - 'gas': mean(list(i_s.gas_opex for i_s in self.hist_table)), - 'oil': mean(list(i_s.oil_opex for i_s in self.hist_table)), - 'water': mean(list(i_s.water_opex for i_s in self.hist_table)) + 'electricity': + mean(list(i_s.electricity_opex for i_s in self.hist_table)), + 'gas': + mean(list(i_s.gas_opex for i_s in self.hist_table)), + 'oil': + mean(list(i_s.oil_opex for i_s in self.hist_table)), + 'water': + mean(list(i_s.water_opex for i_s in self.hist_table)) } - current_income_statement.put_average(average_revenue, annual_bills, self.characters) + current_income_statement.put_average(average_revenue, annual_bills, + self.characters) return convert_income_statement_class(current_income_statement) @@ -429,19 +463,33 @@ class Income_Statement_Table(): for current_income_statement in self.table: if current_income_statement.year == year: return { - 'year': current_income_statement.year, - 'revenue': current_income_statement.revenue, - 'utility_expense': current_income_statement.utility_expense, - 'energy_opex': current_income_statement.energy_opex, - 'electricity_opex': current_income_statement.electricity_opex, - 'gas_opex': current_income_statement.gas_opex, - 'oil_opex': current_income_statement.oil_opex, - 'water_opex': current_income_statement.water_opex, - 'other_utility': current_income_statement.other_utility, - 'non_utility_expense': current_income_statement.non_utility_expense, - 'net_non_energy_opex': current_income_statement.net_non_energy_opex, - 'total_opex': current_income_statement.total_opex, - 'noi': current_income_statement.noi} + 'year': + current_income_statement.year, + 'revenue': + current_income_statement.revenue, + 'utility_expense': + current_income_statement.utility_expense, + 'energy_opex': + current_income_statement.energy_opex, + 'electricity_opex': + current_income_statement.electricity_opex, + 'gas_opex': + current_income_statement.gas_opex, + 'oil_opex': + current_income_statement.oil_opex, + 'water_opex': + current_income_statement.water_opex, + 'other_utility': + current_income_statement.other_utility, + 'non_utility_expense': + current_income_statement.non_utility_expense, + 'net_non_energy_opex': + current_income_statement.net_non_energy_opex, + 'total_opex': + current_income_statement.total_opex, + 'noi': + current_income_statement.noi + } return None def get_noi_dict(self): @@ -452,45 +500,181 @@ class Income_Statement_Table(): """ noi_dict = {} for current_income_statement in self.table: - noi_dict[current_income_statement.year] = current_income_statement.noi + noi_dict[ + current_income_statement.year] = current_income_statement.noi return noi_dict -# # ************ guide for front end dev *********** -# # First, fill in bill overview, save it. +class Balance_Sheet(): + def __init__(self): + self.year = None + self.cash = None + # self.current_assets = None + # self.fixed_assets = None + self.other_debt_service = None + # self.current_liabilities = None + # self.fixed_liablities = None + # self.bop_equity = None + # self.cap_holdings = None + self.net_income = None + # self.eop_equity = None + + def put_hist_balance_sheet(self, year, balance_sheet_input): + """Put historical data values into balance sheet based on the cash balance years. + Args: + year (int): year + balance_sheet_input (dictionary): dictionary of balance sheet items: cash, noi, debt_service + Returns: + dictionary: filled in balance sheet + """ + self.year = year + self.cash = balance_sheet_input['cash'][year] + self.other_debt_service = balance_sheet_input['other_debt_service'][ + year] + self.net_income = balance_sheet_input['net_income'][year] + + +def convert_balance_sheet_class(balance_sheet_class): + balance_sheet_dict = { + 'year': balance_sheet_class.year, + 'cash': balance_sheet_class.cash, + 'other_debt_service': balance_sheet_class.other_debt_service, + 'net_income': balance_sheet_class.net_income + } + return balance_sheet_dict + + +class Balance_Sheet_Next(): + def __init__(self, year, last_year_cash, other_debt_service, net_income): + + self.year = year + self.other_debt_service = other_debt_service + self.net_income = net_income + self.cash = last_year_cash - self.other_debt_service + self.net_income + + +class Balance_Sheet_Table(): + def __init__(self, balance_sheet_input): + + self.hist_start_year = None + self.hist_end_year = None + self.hist_balance_sheet_table = [] + self.bs_table = [] + # entire table, not just historical + + for year in balance_sheet_input['cash']: + + current_balance_sheet = Balance_Sheet() + current_balance_sheet.put_hist_balance_sheet( + year, balance_sheet_input) + self.hist_balance_sheet_table.append(current_balance_sheet) + + sorted_balance_sheet_hist_year = sorted(balance_sheet_input['cash']) + self.hist_start_year = sorted_balance_sheet_hist_year[0] + self.hist_end_year = sorted_balance_sheet_hist_year[-1] + + self.bs_table = self.hist_balance_sheet_table + + def project_balance_sheet(self, analysis_date, other_debt_service, + net_income_dictionary): + """Create balance sheet projection. + Args: + analysis_date (dict): {pro_forma date: duration (years)} + other_debt_service (dict): dictionary of debt service values per year + net_income_dictionary (dict): dictionary of net income values per years + Returns: + dictionary: full dictionary of dictionaries of balance sheet entries + """ + + proforma_year = form_bill_year(analysis_date['proforma_start'], + analysis_date['proforma_duration']) + current_table = copy.deepcopy(self.hist_balance_sheet_table) + for year in proforma_year: + last_year_cash = current_table[-1].cash + if year <= current_table[-1].year: + continue + current_other_debt_service = 0.00 + current_net_income = 0.00 + if year in other_debt_service: + current_other_debt_service = other_debt_service[year] + if year in net_income_dictionary: + current_net_income = net_income_dictionary[year] + current_balance_sheet = Balance_Sheet_Next( + year, last_year_cash, current_other_debt_service, + current_net_income) + current_table.append(current_balance_sheet) + self.bs_table = current_table + return current_table + + def get_hist_balance_sheet_table(self): + hist_balance_sheet_dict = {} + for current_balance_sheet in self.hist_balance_sheet_table: + hist_balance_sheet_dict[current_balance_sheet.year] = { + 'other_debt_service': current_balance_sheet.other_debt_service, + 'net_income': current_balance_sheet.net_income, + 'cash': current_balance_sheet.cash + } + return hist_balance_sheet_dict + + def get_single_year_balance_sheet(self, year): + + for current_balance_sheet in self.bs_table: + if current_balance_sheet.year == year: + return { + current_balance_sheet.year: { + 'other_debt_service': + current_balance_sheet.other_debt_service, + 'net_income': + current_balance_sheet.net_income, + 'cash': + current_balance_sheet.cash + } + } + return None + + def get_first_year_cash(self, commission_date): + + first_year = commission_date.year+1 + for current_balance_sheet in self.bs_table: + if current_balance_sheet.year == first_year: + return current_balance_sheet.cash + + + # # ************ guide for front end dev *********** + # # First, fill in bill overview, save it. -# # Second, fill 3 years of in income statement, choose growth_rate_flag. Default value = -2.0, can be anything -# growth_rate_flag = -2.0 + # # Second, fill 3 years of in income statement, choose growth_rate_flag. Default value = -2.0, can be anything + # growth_rate_flag = -2.0 -# # Click calculate, take in bill_overview, the one with manual inputs, with a lot zeros -# bill_overview_organized = organize_bill_overview(db.bill_overview, db.analysis_date) + # # Click calculate, take in bill_overview, the one with manual inputs, with a lot zeros + # bill_overview_organized = organize_bill_overview(db.bill_overview, db.analysis_date) -# # Then, backend create Income_Statement_Table instance -# IS_table = Income_Statement_Table(db.raw_income_input, bill_overview_organized) + # # Then, backend create Income_Statement_Table instance + # IS_table = Income_Statement_Table(db.raw_income_input, bill_overview_organized) -# # Now, historical table and cagr are ready to be fetched. Can do it later with other get() -# print('\n hist_table =', IS_table.get_hist_table()) -# print('\n cagr =', IS_table.get_cagr()) + # # Now, historical table and cagr are ready to be fetched. Can do it later with other get() + # print('\n hist_table =', IS_table.get_hist_table()) + # print('\n cagr =', IS_table.get_cagr()) -# # Then, backend does projection calculation, call project func in Income_Statement_Table instance -# IS_table.project(growth_rate_flag, db.analysis_date, bill_overview_organized) + # # Then, backend does projection calculation, call project func in Income_Statement_Table instance + # IS_table.project(growth_rate_flag, db.analysis_date, bill_overview_organized) -# # Now, front end can get any single year and average. please follow the instruction below -# print('\n next_column =', IS_table.get_single_year(IS_table.hist_end_year + 1)) -# print('\n average_column =', IS_table.get_average()) + # # Now, front end can get any single year and average. please follow the instruction below + # print('\n next_column =', IS_table.get_single_year(IS_table.hist_end_year + 1)) + # print('\n average_column =', IS_table.get_average()) -# ### front end doens't need this get yet -# print('\n noi dict =', IS_table.get_noi_dict()) + # ### front end doens't need this get yet + # print('\n noi dict =', IS_table.get_noi_dict()) -# ************ test draft*********** -# class test_stru(): -# def __init__(self, number): -# self.number = number + # ************ test draft*********** + # class test_stru(): + # def __init__(self, number): + # self.number = number -# test_1 = test_stru(2.0) -# test_2 = test_stru(3.0) -# test_3 = test_stru(5.0) + # test_1 = test_stru(2.0) + # test_2 = test_stru(3.0) + # test_3 = test_stru(5.0) -# test_list = [test_1, test_2, test_3] -# form_list = list(ob.number for ob in test_list) -# print(form_list) + # test_list = [test_1, test_2, test_3] + # form_list = list(ob.number for ob in test_list) + # print(form_list) diff --git a/bpfin/tests/test_financials/test_balance_sheet_projection.py b/bpfin/tests/test_financials/test_balance_sheet_projection.py index 05c4afe36d838827cc701ef239de45c1e6f1a7c7..fc0cc9c3f7d4915c887259d6dabb86090ee77e13 100644 --- a/bpfin/tests/test_financials/test_balance_sheet_projection.py +++ b/bpfin/tests/test_financials/test_balance_sheet_projection.py @@ -1,4 +1,5 @@ from bpfin.financials.balance_sheet_projection import balance_sheet_projection +from bpfin.financials.financial_lib import Income_Statement_Table from bpfin.tests.testdata import sample_data as db import datetime @@ -6,7 +7,7 @@ import datetime def test_balance_sheet_projection(): input_cash_balance = db.cash_balance input_liability = db.liability_dictionary - input_noi = db.income_statement_projection_cagr + input_noi = db.noi_dictionary input_date_years = {datetime.date(2012, 1, 15): 25} output = { 2012: None, diff --git a/bpfin/tests/test_financials/test_financial_lib.py b/bpfin/tests/test_financials/test_financial_lib.py index f4b4a36242ab83f421151e29d5c9fbbadcdc9a74..e5a1bcb506050a046a5fe17aa1cb84c5a44ceec7 100644 --- a/bpfin/tests/test_financials/test_financial_lib.py +++ b/bpfin/tests/test_financials/test_financial_lib.py @@ -2,13 +2,15 @@ import datetime import bpfin.financials.financial_lib as fl from bpfin.tests.testdata import sample_data as db from bpfin.financials.financial_lib import Income_Statement_Table +from bpfin.financials.financial_lib import Balance_Sheet_Table def test_organize_bill_overview(): input_bill_overview = db.bill_overview input_analysis_date = db.analysis_date output_dict = db.bill_overview_organized - result_dict = fl.organize_bill_overview(input_bill_overview, input_analysis_date) + result_dict = fl.organize_bill_overview(input_bill_overview, + input_analysis_date) assert output_dict == result_dict @@ -21,12 +23,37 @@ def test_Income_Statement_Table(): output_noi_dict = db.noi_dict_average output_single_year = db.income_statement_2017_avg - IS_table = Income_Statement_Table(input_raw_income_input, input_annual_bill_table) + IS_table = Income_Statement_Table(input_raw_income_input, + input_annual_bill_table) IS_table.project(-1.0, db.analysis_date, db.bill_overview_organized) assert IS_table.get_cagr() == output_cagr # test get_cagr assert IS_table.get_hist_table() == output_hist_table # test get_hist_table assert IS_table.get_average() == output_average_table # test get_average assert IS_table.get_noi_dict() == output_noi_dict # test get_noi_dict - assert IS_table.get_single_year(2017) == output_single_year # test get_single_year + assert IS_table.get_single_year( + 2017) == output_single_year # test get_single_year + +def test_Balance_Sheet_Table(): + input_raw_balance_sheet = db.raw_balance_sheet + output_hist_balance_sheet_table = db.hist_balance_sheet + output_single_year_bs_2018 = db.balance_sheet_2018 + output_single_year_bs_2025 = db.balance_sheet_2025 + output_single_year_bs_2030 = db.balance_sheet_2030 + output_first_year_cash = db.hist_balance_sheet[2016]['cash'] + + BS_table = Balance_Sheet_Table(input_raw_balance_sheet) + BS_table.project_balance_sheet(db.analysis_date, db.liability_dictionary, + db.noi_dictionary) + + assert BS_table.get_hist_balance_sheet_table( + ) == output_hist_balance_sheet_table + assert BS_table.get_single_year_balance_sheet( + 2018) == output_single_year_bs_2018 + assert BS_table.get_single_year_balance_sheet( + 2025) == output_single_year_bs_2025 + assert BS_table.get_single_year_balance_sheet( + 2030) == output_single_year_bs_2030 + assert BS_table.get_first_year_cash( + datetime.date(2015, 10, 1)) == output_first_year_cash diff --git a/bpfin/tests/testdata/sample_data.py b/bpfin/tests/testdata/sample_data.py index 9fd24b8525cbe3c3844b6bbbbebea77bbde61ec5..8d2ec0218ded588e1d18517201eb3b1d85f23968 100644 --- a/bpfin/tests/testdata/sample_data.py +++ b/bpfin/tests/testdata/sample_data.py @@ -507,6 +507,12 @@ income_statement_projection_cagr = { 'water_opex': 0.0, 'year': 2036}} +noi_dictionary = {2014: 31500, 2015: 37000, 2016: 37000, 2017: 41278.43692755746, 2018 : 45214.28536645262, 2019 : 48842.631285961135, +2020: 52731.934093183474,2021: 56939.349890971425,2022:61487.1217724919, 2023 : 66332.18430708232, +2024: 71461.4261836982, 2025: 76882.87761572453, 2026: 82578.96693651963, 2027: 88565.60757013515, +2028: 94901.76519041706, 2029: 101627.80434590613, 2030: 108765.29589285178, 2031: 116334.19001298171, 2032: 124349.95052275498, +2033: 132827.33443479502, 2034: 141788.36292608615, 2035: 151259.5001164715, 2036: 161269.59000112678} + liability_input = {'debt1': (150, 'NYSERDA', 10, datetime.date(2012, 12, 31)), 'debt2': (100, 'NYCEEC', 20, datetime.date(2012, 8, 31))} @@ -526,6 +532,23 @@ cash_balance = { 2014: 5000.0, 2015: 6000, 2016: 4500.0 } +raw_balance_sheet = {'cash': cash_balance, 'other_debt_service': liability_dictionary, + 'net_income': noi_dictionary} + +hist_balance_sheet = {2014: {'cash': 5000, 'other_debt_service': 100, 'net_income': 31500}, + 2015: {'cash': 6000, 'other_debt_service': 6000, 'net_income': 37000}, + 2016: {'cash': 4500, 'other_debt_service': 15000, 'net_income': 37000}} + +balance_sheet_2018 = {2018: {'cash': 75992.72229401008,'other_debt_service': 5000, +'net_income': 45214.28536645262}} + +balance_sheet_2025 = {2025: {'cash': 510670.2474431231,'other_debt_service': 0.00, +'net_income': 76882.87761572453}} + +balance_sheet_2030 = {2030: {'cash': 987109.6873789529,'other_debt_service': 0.00, +'net_income': 108765.29589285178}} + + # pro-forma date and bill projection - # proforma_date_from, proforma_date_to # prior_rough, post_rough