diff --git a/bpfin/financials/liability.py b/bpfin/financials/liability.py index 70cf1c665c54bb01d12b33eabce4429a5df8fe57..642df73f4bf3394021001cce795d6f9c61cae00f 100644 --- a/bpfin/financials/liability.py +++ b/bpfin/financials/liability.py @@ -69,7 +69,7 @@ def create_liability_dict(liability_dictionary): return final_dict -def final_liability_dict(start_date, liability_dictionary, months): +def final_liability_dict(analysis_date, liability_dictionary): """Create dictionary of {(year,month):debt value}, which includes all debts Args: start_date (datetime): first date of the dictionary @@ -78,46 +78,45 @@ def final_liability_dict(start_date, liability_dictionary, months): Return: dictionary: {(year,month):debt value} """ - if liability_dictionary: - final_dict = {} - pro_forma_calendar = liability_calendar(start_date, months) - debt_list = create_liability_dict(liability_dictionary) - for pro_date in pro_forma_calendar: - for debt_date_dict in debt_list: - for debt_date in debt_date_dict: - if pro_date.year == debt_date.year and pro_date.month == debt_date.month: - if (pro_date.year, pro_date.month, calendar.monthrange( - pro_date.year, - pro_date.month)[1]) not in final_dict: - final_dict[( - pro_date.year, pro_date.month, calendar.monthrange( - pro_date.year, pro_date.month)[1])] = [] - final_dict[(pro_date.year, - pro_date.month, - calendar.monthrange( - pro_date.year, - pro_date.month)[1] - )].append(debt_date_dict[debt_date]) - for pro_date in pro_forma_calendar: - if (pro_date.year, pro_date.month, calendar.monthrange( - pro_date.year, pro_date.month)[1]) not in final_dict: - final_dict[(pro_date.year, pro_date.month, calendar.monthrange( - pro_date.year, pro_date.month)[1])] = [0] + final_dict = {} + pro_forma_calendar = liability_calendar( + analysis_date['proforma_start'], + analysis_date['proforma_duration'] * 12) + debt_list = create_liability_dict(liability_dictionary) + for pro_date in pro_forma_calendar: + for debt_date_dict in debt_list: + for debt_date in debt_date_dict: + if pro_date.year == debt_date.year and pro_date.month == debt_date.month: + if (pro_date.year, pro_date.month, calendar.monthrange( + pro_date.year, + pro_date.month)[1]) not in final_dict: + final_dict[( + pro_date.year, pro_date.month, calendar.monthrange( + pro_date.year, pro_date.month)[1])] = [] + final_dict[(pro_date.year, + pro_date.month, calendar.monthrange( + pro_date.year, pro_date.month)[1] + )].append(debt_date_dict[debt_date]) + for pro_date in pro_forma_calendar: + if (pro_date.year, pro_date.month, calendar.monthrange( + pro_date.year, pro_date.month)[1]) not in final_dict: + final_dict[(pro_date.year, pro_date.month, calendar.monthrange( + pro_date.year, pro_date.month)[1])] = [0] - for key, value in final_dict.items(): - final_dict[key] = sum(value) + for key, value in final_dict.items(): + final_dict[key] = sum(value) - real_dict = {} - for key, value in final_dict.items(): - real_dict[datetime(key[0], key[1], key[2])] = value + real_dict = {} + for key, value in final_dict.items(): + real_dict[datetime(key[0], key[1], key[2])] = value - annual_liability_dict = {} - for full_date, liability in real_dict.items(): - if full_date.year not in annual_liability_dict: - annual_liability_dict[full_date.year] = [] - annual_liability_dict[full_date.year].append(liability) - sum_dict = {} - for year, value in annual_liability_dict.items(): - sum_dict[year] = sum(value) + annual_liability_dict = {} + for full_date, liability in real_dict.items(): + if full_date.year not in annual_liability_dict: + annual_liability_dict[full_date.year] = [] + annual_liability_dict[full_date.year].append(liability) + sum_dict = {} + for year, value in annual_liability_dict.items(): + sum_dict[year] = sum(value) - return sum_dict + return sum_dict diff --git a/bpfin/tests/test_financials/test_liability.py b/bpfin/tests/test_financials/test_liability.py index 8c18ba5d964dd9f4a59c9d51ae9a83562ca094f7..3c0433b317243c1d041616efba813522a55d7395 100644 --- a/bpfin/tests/test_financials/test_liability.py +++ b/bpfin/tests/test_financials/test_liability.py @@ -1,19 +1,112 @@ -from datetime import datetime +from datetime import date from bpfin.financials.liability import final_liability_dict from bpfin.tests.testdata import sample_data as db def test_final_liability_dict(): - input_start_date = db.analysis_date['proforma_start'] + input_analysis_date = db.analysis_date input_dict = db.liability_input - input_duration = db.analysis_date['proforma_duration'] output = { 2012: 650, 2013: 2550, - 2014: 100 + 2014: 300, + 2015: 0, + 2016: 0, + 2017: 0, + 2018: 0, + 2019: 0, + 2020: 0, + 2021: 0, + 2022: 0, + 2023: 0, + 2024: 0, + 2025: 0, + 2026: 0, + 2027: 0, + 2028: 0, + 2029: 0, + 2030: 0, + 2031: 0, + 2032: 0, + 2033: 0, + 2034: 0, + 2035: 0, + 2036: 0, } - result = final_liability_dict(input_start_date, input_dict, input_duration) - print(result) + result = final_liability_dict(input_analysis_date, input_dict) + assert output == result + + +def test_final_liability_dict_single_year(): + input_dict = {'debt1': (100, 'NYSERDA', 10, date(2012, 12, 31))} + input_analysis_date = db.analysis_date + output = { + 2012: 100, + 2013: 900, + 2014: 0, + 2015: 0, + 2016: 0, + 2017: 0, + 2018: 0, + 2019: 0, + 2020: 0, + 2021: 0, + 2022: 0, + 2023: 0, + 2024: 0, + 2025: 0, + 2026: 0, + 2027: 0, + 2028: 0, + 2029: 0, + 2030: 0, + 2031: 0, + 2032: 0, + 2033: 0, + 2034: 0, + 2035: 0, + 2036: 0 + } + result = final_liability_dict(input_analysis_date, input_dict) + assert output == result + +def test_final_liability_dict_year_gap(): + input_dict = { + 'debt1': (100, 'NYSERDA', 10, date(2012, 12, 31)), + 'debt2': (200, 'Joe', 24, date(2014, 12, 31)), + 'debt3': (50, 'Tooraj', 12, date(2015, 3, 15)), + 'debt4': (250, 'Frank', 3, date(2018, 12, 31)) + } + input_analysis_date = db.analysis_date + output = { + 2012: 100, + 2013: 900, + 2014: 200, + 2015: 2900, # 2400 + 500 + 2016: 2300, # 2200 + 100 + 2017: 0, + 2018: 250, + 2019: 500, + 2020: 0, + 2021: 0, + 2022: 0, + 2023: 0, + 2024: 0, + 2025: 0, + 2026: 0, + 2027: 0, + 2028: 0, + 2029: 0, + 2030: 0, + 2031: 0, + 2032: 0, + 2033: 0, + 2034: 0, + 2035: 0, + 2036: 0 + + } + result = final_liability_dict(input_analysis_date, input_dict) assert output == result