3 from dataclasses import dataclass
4 from typing import List
6 import string_utils as su
7 from type.money import Money
12 @dataclass(repr=False)
13 class SimulationResults(object):
17 max_networth_year: int
21 max_rollover_year: int
25 total_social_security: Money
26 final_account_state: List[account.Account]
28 final_taxes: taxman.TaxCollector
31 def create(cls) -> "SimulationResults":
32 return SimulationResults(
38 Money(0), Money(0), [], Money(0), None
43 for a in self.final_account_state:
44 total += a.get_balance()
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:
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}'
57 print(' %-50s: %18s (%s)' % (
58 'Final net worth', f'{total}', f'in {self.end_year}'
60 print(' %-50s: %18s (%s)' % (
61 'Maximum annual RMDs', f'{self.max_rmd}', f'in {self.max_rmd_year}'
63 print(' %-50s: %18s' % (
64 'Total social security', f'{self.total_social_security}'
66 print(' %-50s: %18s (%s)' % (
67 'Maximum annual taxes due', f'{self.max_taxes}', f'in {self.max_taxes_year}'
69 print(' %-50s: %18s' % (
70 'Total Roth conversions', f'{self.total_rollover}'
72 print(' %-50s: %18s (%s)' % (
73 'Maximum Roth conversion', f'{self.max_rollover}', f'in {self.max_rollover_year}'