Updated.
[retire.git] / simulation_results.py
1 #!/usr/bin/env python3
2
3 from dataclasses import dataclass
4 from typing import List
5
6 import string_utils as su
7 from type.money import Money
8
9 import account
10 import taxman
11
12 @dataclass(repr=False)
13 class SimulationResults(object):
14     success: bool
15     end_year: int
16     max_networth: Money
17     max_networth_year: int
18     max_taxes: Money
19     max_taxes_year: int
20     max_rollover: Money
21     max_rollover_year: int
22     max_rmd: Money
23     max_rmd_year: int
24     total_rollover: Money
25     total_social_security: Money
26     final_account_state: List[account.Account]
27     final_networth: Money
28     final_taxes: taxman.TaxCollector
29
30     @classmethod
31     def create(cls) -> "SimulationResults":
32         return SimulationResults(
33             False, 0,
34             Money(0), 0,
35             Money(0), 0,
36             Money(0), 0,
37             Money(0), 0,
38             Money(0), Money(0), [], Money(0), None
39         )
40
41     def __repr__(self):
42         total = Money(0)
43         for a in self.final_account_state:
44             total += a.get_balance()
45
46         with su.SprintfStdout() as ret:
47             print("SIMULATION RESULTS:")
48             print('%-54s: %18s' % ('Successful?', self.success))
49             for x in self.final_account_state:
50                 x.dump_final_report()
51
52             print(self.final_taxes)
53             print('Simulation Maximums / Aggregates:')
54             print('    %-50s: %18s (%s)' % (
55                 'Maximum net worth', f'{self.max_networth}', f'in {self.max_networth_year}'
56             ))
57             print('    %-50s: %18s (%s)' % (
58                 'Final net worth', f'{total}', f'in {self.end_year}'
59             ))
60             print('    %-50s: %18s (%s)' % (
61                 'Maximum annual RMDs', f'{self.max_rmd}', f'in {self.max_rmd_year}'
62             ))
63             print('    %-50s: %18s' % (
64                 'Total social security', f'{self.total_social_security}'
65             ))
66             print('    %-50s: %18s (%s)' % (
67                 'Maximum annual taxes due', f'{self.max_taxes}', f'in {self.max_taxes_year}'
68             ))
69             print('    %-50s: %18s' % (
70                 'Total Roth conversions', f'{self.total_rollover}'
71             ))
72             print('    %-50s: %18s (%s)' % (
73                 'Maximum Roth conversion', f'{self.max_rollover}', f'in {self.max_rollover_year}'
74             ))
75         return ret()